2013-03-13 4 views
3

Я использую SMIE для анализа языка, который не всегда требует ;, чтобы завершить утверждение. Если конец строки находится за пределами конструкции фигурной скобки ({}, (), []), а последний токен без комментария не был оператором, то \n действует как терминатор утверждения. В противном случае, если конец строки находится в конструкции скобки или последний токен был оператором, то \n действует как продолжение.Использование SMIE Emac для синтаксического анализа языка с опцией; для завершения заявления

Например,

variable := 172 + 92; 

variable := 172 + 92 

variable := 
    172 + 92; 

variable := 
    172 + 92 

variable := (172 + 
    92) 

все действительные заявления. Но,

variable 
    := 172 + 92 

нет.

Как я могу кодировать это грамматика BNF для SMIE (или любого BNF для стартеров)? Или это невозможно?

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

ответ

3

Нет, вы не можете закодировать его в BNF (потому что SMIE принимает только очень слабые BNF, которые не могут выразить это). Посмотрите, как я сделал это для режима Octave: токенизатор выполнен для возврата ";", когда он встречает \n, который находится за пределами скобки/кронштейна/парика (который вы можете проверить с помощью (zerop (car (syntax-ppss)))).

 Смежные вопросы

  • Нет связанных вопросов^_^