Грамматика ANTLR: синтаксический анализатор - и литералы лексического анализатора

Что является различием между этой грамматикой:

...
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';
....

?

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

8
задан Bart Kiers 23 March 2010 в 13:02
поделиться

3 ответа

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

1
ответ дан 5 December 2019 в 14:02
поделиться

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

9
ответ дан 5 December 2019 в 14:02
поделиться

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

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

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

Ни один из подходов не влияет на производительность во время выполнения после создания парсера Antlr.

2
ответ дан 5 December 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: