我正在尝试解析一种上下文无关的语言,称为 Context Free Art .我使用类似 YACC 的 JS LALR(1) 解析器生成器在 Javascript 中创建了它的解析器 JSCC .
以下面的 CFA (Context Free Art) 代码为例。此代码是有效的 CFA。
startshape A
rule A { CIRCLE { s 1} }
注意上面的 A
和 s
。 s
是缩放CIRCLE
的命令,而A
只是这个规则的名称。在该语言的语法中,我将 s
设置为标记 SCALE
并且 A
位于标记 STRING
下(我有一个常规匹配字符串的表达式,它位于所有标记的底部)。
这工作正常,但在下面的情况下它会中断。
startshape s
rule s { CIRCLE { s 1} }
这也是一个完全有效的代码,但由于我的解析器将 rule
之后的 s
标记为 SCALE
标记,所以它会错误地指出它期待 STRING
。
现在我的问题是,是否有任何方法可以重写解析器的产生式规则来解决这个问题?相关的产生式规则是:-
rule:
RULE STRING '{' buncha_replacements '}' [* rule(%2, 1) *]
|
RULE STRING RATIONAL '{' buncha_replacements '}' [* rule(%2, 1*%3) *]
;
我能想到的一个简单解决方案是创建上述规则的副本,将 STRING
替换为 SCALE
,但这只是需要的许多类似规则之一这样的固定。此外,还有许多其他终端可以匹配到 STRING
。所以这意味着太多的规则!
最佳答案
是的!最后我的问题的解决方案击中了我。我需要做的就是将上面的作品修改为:-
rule:
RULE user_string '{' buncha_replacements '}' [* rule(%2, 1) *]
|
RULE user_string RATIONAL '{' buncha_replacements '}' [* rule(%2, 1*%3) *]
;
user_string:
STRING | SCALE ;
与我在问题文本中提到的相比,这是一个非常优雅的解决方案。如果有人有更好的解决方案,请发表评论。
关于javascript - 需要有关一个 LALR(1) 解析的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6452402/