2013-07-28 3 views
0

Когда я отлаживал свою грамматику для C#, я заметил что-то очень необычное: некоторые входы, которые не принимаются полной грамматикой, принимаются одной и той же грамматикой с некоторыми независимыми правилами. Я не мог найти логического объяснения. Например:Могут ли независимые правила влиять друг на друга?

CS - это грамматика не принимает входные данные a<a<a>><EOF>

CS' - и эту грамматику, которая в основном так же, как CS, но с некоторыми независимыми правилами удаляемых (правила не заказаны) не принимает a<a<a>><EOF>

Как вы можете видеть, оба грамматики начинаются с правила start: namespaceOrTypeName EOF;, и поэтому они должны вызывать тот же набор правил (CS никогда не будет вызывать те правила, которые удалены в CS'). Я потратил один день на отладку, удалив или добавив новые правила, но не смог найти недостаток в логике. Любая помощь была бы полезной, спасибо.

Unicode

EDIT: После изменения правила пуска в CS, чтобы start: Identifier EOF; грамматика начинает отвергать вход method, который обычно принимается, когда определяются только Identifier правила. Поэтому я предполагаю, что существует правило attributeTarget: ...| 'method' | ..., что после компиляции грамматики некоторые фразы получают зарезервированные, такие как «метод» в этом случае, но я не уверен, что это так.

ответ

1

Первая грамматика включает правило overloadableBinaryOperator, которое неявно определяет токен >>. Так как >> является 2-символьным токеном, лексер никогда не будет обрабатывать вход >> как два отдельных токена 1-символа >, >. Если вы откроете грамматику в ANTLRWorks 2, вы увидите предупреждающий индикатор для каждого неявно определенного токена. Вы должны удалить все эти предупреждения:

  1. Создание явных правил лексера для каждого токена, который вы намереваетесь появиться на входе.
  2. Только с использованием синтаксиса 'new' в правиле анализатора, если существует соответствующее правило лексера для литерала 'new'.
Смежные вопросы