需要有关一个LALR1解析的帮助

问题描述

| 我正在尝试解析一种称为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 ;
与我在问题文本中提到的相比,这是一个非常优雅的解决方案。如果有人有更好的解决方案,请发表评论。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...