Rascal:解析 BNF 的语法

Rascal: Grammar to Parse BNF

我想写一个具体的语法来解析类似 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]*;

对于范围内的所有语法规则,它将在所有符号之间混合使用此非终结符。它单独留下词法规则。