gpt4 book ai didi

python - Antlr4 在 RaspberryPi 上运行缓慢

转载 作者:太空宇宙 更新时间:2023-11-03 14:19:21 25 4
gpt4 key购买 nike

我们正在尝试使用 Antlr4(Python2 目标)在 RaspberryPi B 上解析自定义语言。然而,做任何严肃的事情都太慢了:解析几行大约需要十秒钟。这是我的代码:

Transposeur.py:

# -*- coding:Utf-8 -*-

from antlr4 import *
from TransposeurLexer import TransposeurLexer
from TransposeurParser import TransposeurParser
import sys
from Listener import Listener

def transpose(file_path):

input = FileStream(file_path)
lexer = TransposeurLexer(input)
stream = CommonTokenStream(lexer)
parser = TransposeurParser(stream)
tree = parser.myfile()
listener = Listener()
walker = ParseTreeWalker()
walker.walk(listener, tree)
return listener.array

Transposeur.g4:

grammar Transposeur;

myfile: block+;

block: title
| paragraph
;

title: firstTitle
| secondTitle
;

firstTitle: '#' ' '? unit+ newline;
secondTitle: '##' ' '? unit+ newline;

paragraph: unit+ newline;

unit: low+
| upper
| (low | cap)* cap (low | cap)*
| ponctuation
| number
| space
;

upper: cap cap+;
number: digit+;

low: LOW;
cap: CAP;
newline: NEWLINE;
ponctuation: SPACE? PONCT;
space: SPACE;
digit: DIGIT;

LOW: [a-z] | 'ç' | 'é' | 'è' | 'à' | 'â' | 'ê' | 'ù' | 'î' | 'ô' | 'û' | 'ë' | 'ï' | 'ü' | 'œ';
CAP: [A-Z];
NEWLINE: '\r'? '\n';
SPACE: ' ';
DIGIT: [0-9];
PONCT: ',' | '!' | '?' | ';' | '.' | ':';

耗时的命令是tree = parser.myfile()。有什么方法可以让事情变得更快吗?

最佳答案

我怀疑它在解决 low+ 与 (low | cap)* .... 的情况时遇到了麻烦,它可能不得不任意地展望 future 以确定哪个申请减免。

我认为真正的问题是您的 unit+ 引用相对于 low+ 不明确。给定包含以下内容的单元的文本:

      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

(五十个“a”)。可以用以下方法解析:

  • 单位所有“a”都为low+
  • unit unit 具有任何前缀的第一个 low+,以及其余“a”的第二个 low+(即 2500 种可能性)
  • unit 单位,任何前缀的第一个 low+,任何剩余后缀的最后一个 low+,以及中间的 low+ 中的字符在(方式,更多可能性)之间
  • 单位单位单位单位 ...

所以我认为你的这部分语法非常含糊,ANTLR 正在探索巨大的选择空间,试图选择一个。你可能是幸运的是 ANTLR 足够快,可以完成:-}

unit+upper (== cap+) 也会遇到同样的问题。

我不清楚您真正需要捕获多少单元结构。在我看来你只想要一个字符串。尝试将其重新编码为:

unit: low
| cap
| ponctuation
| number
| space
;

更好的是,这样定义单位:

unit: LOW | CAP | PONCT | DIGIT | SPACE ;

关于python - Antlr4 在 RaspberryPi 上运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29790425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com