我想写一个具体的语法来解析类似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
我也尝试在GrammarRule之前使用start
关键字,但这没有帮助。我在做什么错?
lexical Identifier = [a-z]+ !>> [a-z];
这有助于生成不明确的标识符列表。附加的!>>约束声明仅当无法使用其他字符时,标识符才可接受。
此外,这也是解决解析错误所必需的:
layout Whitespace = [\ \n\r]*;
对于范围内的所有语法规则,它将在所有符号之间混合此非终结符。它只剩下词汇规则。