Antlr4在RaspberryPi上变慢

时间:2015-04-22 07:20:11

标签: python parsing raspberry-pi antlr antlr4

我们正在尝试使用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()。有没有办法让事情变得更快?

1 个答案:

答案 0 :(得分:5)

我怀疑它在解决低+ vs(低|上限)* .... 的情况时遇到问题,可能需要在任意前方查看以确定减少适用。

我认为真正的问题是你的单位+ 引用在低+ 方面是不明确的。鉴于单位的文本包括:

      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

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

  • 单位 的所有“a”,
  • 单位单位,任意前缀的第一个低+ ,以及“a”的其余部分的第二个低+ (2500个可能性) )
  • 单位单位单位,任意前缀的第一个低+ ,任何剩余后缀的最后低+ ,中间低+ 中的字符 之间(方式,方式更多可能性)
  • 单位单位单位 ...

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

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

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

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

更好的是,以这种方式定义单位:

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