Мошенник: грамматика для разбора BNF - PullRequest
1 голос
/ 07 февраля 2020

Я хочу написать конкретную грамматику для анализа BNF-подобных синтаксических определений.

Рассматривая рецепт EXP Concrete Syntax Я создал очень простую первую версию:

module BNFParser

lexical Identifier = [a-z]+ ;

syntax GrammarRule = left RuleHead ":" RuleCase* ";" ;
syntax RuleHead = Identifier ;
syntax RuleCase =  Identifier ;

и вызвал его в Repl следующим образом:

import BNFParser;
import ParseTree;
parse(#GrammarRule, "foo : bar baz ;");

Но это приводит к довольно загадочному сообщению об ошибке:

|std:///ParseTree.rsc|(13035,1963,<393,0>,<439,114>): ParseError(|unknown:///|(3,1,<1,3>,<1,4>))
        at *** somewhere ***(|std:///ParseTree.rsc|(13035,1963,<393,0>,<439,114>))
        at parse(|std:///ParseTree.rsc|(14991,5,<439,107>,<439,112>))
ok

Я также пытался использовать ключевое слово start впереди GrammarRule, но это не помогло. Что я делаю не так?

1 Ответ

1 голос
/ 07 февраля 2020
lexical Identifier = [a-z]+ !>> [a-z];

Это помогает для неоднозначных списков идентификаторов. Дополнительное ограничение! >> объявляет, что идентификаторы допустимы только в том случае, если никакие дополнительные символы не могут использоваться.

Также это необходимо для исправления ошибки разбора:

layout Whitespace = [\ \n\r]*;

Для всех правил синтаксиса в область действия это будет смешивать этот нетерминал между всеми символами. Это оставляет лексические правила в покое.

...