2

我正在尝试解析一种无上下文的语言,称为Context Free Art。我使用类似 YACC 的 JS LALR(1) 解析器生成器JSCC在 Javascript 中创建了它的解析器。

以下面的 CFA (Context Free Art) 代码为例。此代码是有效的 CFA。

startshape A
rule A { CIRCLE { s 1} }

注意上面的Aand ss是缩放 的命令CIRCLE,但A只是此规则的名称。在语言的语法中,我设置s为标记SCALEA属于标记STRING(我有一个正则表达式来匹配字符串,它位于所有标记的底部)。

这工作正常,但在以下情况下它会中断。

startshape s
rule s { CIRCLE { s 1} }

这也是一个完全有效的代码,但是由于我的解析器在标记s之后标记ruleSCALE标记,所以它错误地指出它正在期待STRING.

现在我的问题是,是否有任何方法可以重写解析器的生产规则来解决这个问题?相关的生产规则是:-

rule:
    RULE STRING '{' buncha_replacements '}'    [* rule(%2, 1) *]
    |
    RULE STRING RATIONAL '{' buncha_replacements '}'  [* rule(%2, 1*%3) *]
    ;

我能想到的一个简单的解决方案是创建上述规则的副本,STRING替换为SCALE,但这只是需要此类修复的许多类似规则之一。此外,还有许多其他终端可以匹配到STRING。所以这意味着太多的规则!

4

1 回答 1

0

是的!最后,我的问题的解决方案击中了我。我需要做的就是将上面的制作修改为:-

rule:
    RULE user_string '{' buncha_replacements '}'    [* rule(%2, 1) *]
    |
    RULE user_string RATIONAL '{' buncha_replacements '}'  [* rule(%2, 1*%3) *]
    ;

user_string:
    STRING | SCALE ;

与我在问题文本中提到的相比,这是一个非常优雅的解决方案。如果有人有更好的解决方案,请发表评论。

于 2011-06-23T13:44:30.453 回答