问题描述
|
我正在尝试解析一种称为Context Free Art的无上下文语言。我已经使用类似YACC的JS LALR(1)解析器生成器JSCC在Javascript中创建了其解析器。
以以下CFA(上下文免费艺术)代码为例。此代码是有效的CFA。
startshape A
rule A { CIRCLE { s 1} }
注意上面的the1ѭ和s
。 s
是缩放CIRCLE
的命令,但是A
只是此规则的名称。在语言语法中,我将s
设置为记号SCALE
,而A
设置在记号under9 under下(我有一个正则表达式来匹配字符串,它位于所有记号的底部)。
这可以正常工作,但在以下情况下会中断。
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) *]
;
我能想到的一个简单解决方案是创建一个以上规则的副本,其中用“ 9”替换为“ 9”,但是这只是许多需要进行这种修复的类似规则之一。此外,还有许多其他端子可以匹配STRING
。因此,这意味着太多规则了!
解决方法
是!终于,解决我的问题的方法使我震惊。我需要做的就是将我的上述生产修改为:
rule:
RULE user_string \'{\' buncha_replacements \'}\' [* rule(%2,1) *]
|
RULE user_string RATIONAL \'{\' buncha_replacements \'}\' [* rule(%2,1*%3) *]
;
user_string:
STRING | SCALE ;
与我在问题文本中提到的相比,这是一个非常优雅的解决方案。如果有人有更好的解决方案,请发表评论。