ANTLR грамматика: парсеры и лексеры - PullRequest
8 голосов
/ 23 марта 2010

В чем разница между этой грамматикой:

...
if_statement : 'if' condition 'then' statement 'else' statement 'end_if';
... 

и это:

...
if_statement : IF condition THEN statement ELSE statement END_IF;
...

IF : 'if';
THEN: 'then';
ELSE: 'else';
END_IF: 'end_if';
....

?

Если есть какая-либо разница, так как это влияет на производительность ... Спасибо

Ответы [ 4 ]

8 голосов
/ 23 марта 2010

В дополнение к ответу Уилла, лучше определить ваши токены лексера явно (в вашей грамматике лексера). Если вы смешиваете их в своей грамматике синтаксического анализатора, не всегда ясно, в каком порядке лексеры токенизируют токены. При их явном определении они всегда токенизируются в том порядке, в котором они были помещены в грамматику лексера (сверху вниз).

2 голосов
/ 24 марта 2010

Самая большая разница в том, что может не иметь значения для вас. Если ваши правила Lexer находятся в лексере, вы можете использовать наследование, чтобы несколько лексеров имели общий набор лексических правил.

Если вы просто используете строки в правилах вашего парсера, вы не можете этого сделать. Если вы никогда не планируете повторно использовать грамматику лексера, это преимущество не имеет значения.

Кроме того, я, и я предполагаю, что большинство ветеранов Antlr более привыкли находить правила лексера в реальной грамматике лексера, а не смешиваться с грамматикой синтаксического анализатора, поэтому можно утверждать, что читаемость увеличивается, если поместить лексер.

После того, как анализатор Antlr был создан для любого из этих подходов, это не повлияет на производительность во время выполнения.

1 голос
/ 23 марта 2010

Разница лишь в том, что в вашем первом производственном правиле токены ключевых слов определены неявно. Для токенов, определяемых неявно, а не явно, нет никакого влияния на производительность во время выполнения.

0 голосов
/ 21 сентября 2015

Еще одно отличие: когда вы явно определяете свои правила лексера, вы можете получить к ним доступ через имя, которое вы им дали (например, когда вам нужно проверить конкретный тип токена).В противном случае ANTLR будет использовать произвольные числа (с префиксом).

...