2011-06-23 29 views
2

我想解析一个上下文无关语言,名为Context Free Art。我使用类似YACC的JS LALR(1)解析器生成器JSCC在Javascript中创建了它的解析器。需要关于一个LALR(1)解析的帮助

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

startshape A 
rule A { CIRCLE { s 1} } 

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

这工作正常,但在下面的情况下它打破。

startshape s 
rule s { CIRCLE { s 1} } 

这也是一个完全有效的代码,但因为我的解析器标记sruleSCALE令牌,因此它的错误出来说,这是期待STRING

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

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

一个简单的解决方案,我能想到的是创造上述规则的副本STRINGSCALE代替,但是这仅仅是这将需要这样固定的许多类似的规则之一。此外,还有许多其他终端可以匹配到STRING。这意味着太多规则!

+0

只是上面的一个附件。 YACC(或者Bison)支持类型令牌。所以对于他们来说,如果我们将'STRING'声明为类型标记,那么's'可以是'SCALE'和'STRING',解决了这个问题。不知道这是否可以在JSCC中完成。 – AppleGrew

回答

0

是的!最后,我的问题的解决方案打击了我。所有我需要做的是改变我上面的生产: -

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

user_string: 
    STRING | SCALE ; 

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