需要有关一个LALR(1)解析的帮助

时间:2011-06-23 10:12:15

标签: javascript lalr compiler-compiler

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

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

startshape A
rule A { CIRCLE { s 1} }

请注意上面的Ass是扩展CIRCLE的命令,但A只是此规则的名称。在语言的语法中,我将s设置为令牌SCALE,将A设置为令牌STRING(我有一个正则表达式来匹配字符串,它位于字符的底部所有代币)。

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

startshape s
rule s { CIRCLE { s 1} }

这也是一个非常有效的代码,但由于我的解析器在s之后将rule标记为SCALE令牌,因此它错误地说它期待STRING。< / p>

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

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

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

1 个答案:

答案 0 :(得分:0)

是的!最后解决我的问题的方法让我感到震惊。我需要做的就是将我的上述作品修改为: -

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

user_string:
    STRING | SCALE ;

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