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]*;
对于范围内的所有语法规则,它将在所有符号之间混合使用此非终结符。它单独留下词法规则。
我想写一个具体的语法来解析类似 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]*;
对于范围内的所有语法规则,它将在所有符号之间混合使用此非终结符。它单独留下词法规则。