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

标签 javascript lalr compiler-compiler

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

以下面的 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} }

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

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

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

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

最佳答案

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

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

user_string:
    STRING | SCALE ;

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

关于javascript - 需要有关一个 LALR(1) 解析的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6452402/

相关文章:

parsing - LL 解析器比 LR 解析器有什么优势?

parsing - yacc/bison LALR(1) 算法如何处理 "empty"规则?

java - Javacc 终端的奇怪错误

javascript - 传递给 onclick 属性的类函数未定义

javascript - React-Native 无法导入库

javascript - JEdi​​table,如何处理 JSON 响应?

javascript - 如何使用 nvd3 在柱形图上放置旋转的 x 轴标签?

python - 解析隐式与显式时间运算符

php - 这个文法不是LR(1)吗?