Когда я отлаживал свою грамматику для C#, я заметил что-то очень необычное: некоторые входы, которые не принимаются полной грамматикой, принимаются одной и той же грамматикой с некоторыми независимыми правилами. Я не мог найти логического объяснения. Например:Могут ли независимые правила влиять друг на друга?
CS - это грамматика не принимает входные данные a<a<a>><EOF>
CS' - и эту грамматику, которая в основном так же, как CS, но с некоторыми независимыми правилами удаляемых (правила не заказаны) не принимает a<a<a>><EOF>
Как вы можете видеть, оба грамматики начинаются с правила start: namespaceOrTypeName EOF;
, и поэтому они должны вызывать тот же набор правил (CS никогда не будет вызывать те правила, которые удалены в CS'). Я потратил один день на отладку, удалив или добавив новые правила, но не смог найти недостаток в логике. Любая помощь была бы полезной, спасибо.
EDIT: После изменения правила пуска в CS, чтобы start: Identifier EOF;
грамматика начинает отвергать вход method
, который обычно принимается, когда определяются только Identifier
правила. Поэтому я предполагаю, что существует правило attributeTarget: ...| 'method' | ...
, что после компиляции грамматики некоторые фразы получают зарезервированные, такие как «метод» в этом случае, но я не уверен, что это так.