Rascal:语法分析BNF

问题描述 投票:1回答:1

我想写一个具体的语法来解析类似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关键字,但这没有帮助。我在做什么错?

grammar rascal
1个回答
0
投票
lexical Identifier = [a-z]+ !>> [a-z];

这有助于生成不明确的标识符列表。附加的!>>约束声明仅当无法使用其他字符时,标识符才可接受。

此外,这也是解决解析错误所必需的:

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

对于范围内的所有语法规则,它将在所有符号之间混合此非终结符。它只剩下词汇规则。

© www.soinside.com 2019 - 2024. All rights reserved.