问题标签 [yacc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 如何在c中调用flex解析器
如何在 c 中调用 flex 解析器?
yacc - 野牛移位而不是减少。减少/减少错误
用我的语言我可以写
我的语法不支持语句之间的换行符。else 只能与 if 一起使用。当我在我的规则中添加 optionalNL
else 之前的 optionalNL 会导致 3 个减少/减少。原因是它可以使用 IfExpr 中的第二条规则减少或减少到 exprLoop ,它允许表达式之间有许多换行符。
无论我做什么(我尝试在 optionalNL 和 ELSE 之前编写 %prec )它总是减少到 exprLoop ,这种情况下野牛会给我一个语法错误。我如何告诉野牛此时转移(其他可选NL)而不是减少?(到 exprLoop 导致 else 是一个错误)。
用于测试的示例文件
y.output http://www.pastie.org/707448
替代 .y 和输出。您可以看到它向前看,看到 \n 并且不知道减少规则或继续前进。我改变改变规则的顺序以获得不同的结果。但它要么总是期待一个 \n 要么总是期待一个 else,因此一个规则总是最终被忽略。状态 15
感谢 Kinopiko的回答
我将他的代码更改为没有冲突,然后努力使其更灵活。这是我的文件
测试.y
测试.y
编译后自动运行的测试文件
c++ - 是否可以堆叠 Yacc 语法规则代码?
假设我每次匹配规则时都需要运行一些初始化代码如何减少冗余?
也有可能做类似的事情
compiler-construction - Yacc 程序不识别函数声明
我认为我的程序应该能够将以下内容识别为函数声明:
但事实并非如此。
这是我的 yacc 文件的相关部分:
为什么它不认识它?
c - 在 lex 中如何使 yyin 指向具有 yacc 中主要功能的文件?
我将传递给 yacc 中 main 的参数存储在一个文件中。现在我希望 lex 从这个文件而不是终端读取它的输入。我知道我可以将 yyin 指向类似的文件,yyin = fopen("fn","r");
但这仅在 main 位于 lex 中时才有效。当我在 yacc 的 main 中使用这个 yyin 声明时,它显示一个错误,所以请提出一些解决这个问题的建议。
parsing - 关于使用 yacc 解析器构建符号表的问题
如果我的 yacc 解析器遇到以下代码:
是否应该将 int a 和 int b 添加为 foo 的属性?我现在拥有它的方式,它输入 a 和 b 作为单独的表条目。
parsing - 解决 LALR 解析器中的移位/减少冲突
我一直在使用 PLY 为我的语言构建解析器,但是我遇到了 shift/reduce 冲突,这给我带来了一些麻烦。我的语言具有语法 ala C++ 模板的泛型类型。所以现在我有这样的规则:
但是,我发现它无法解析:
(由于显而易见的原因,这是一个问题)。以下是调试输出:
如果需要更多我的解析器,我可以提供。谢谢。
编辑:向我建议的一种解决方案是使类型成为自己的令牌。这需要做一些工作,因为我的语言不使用预处理器,包括像 C/C++ 这样的系统,但是我认为它仍然是可能的,但是我更喜欢一个仅限于语法的解决方案。
yacc - 我是否被迫使用 %glr-parser?
我一直在避免移位/减少错误。现在终于我想我遇到了我的对手。
问题是 int[] 被定义为
而 a[0] 被定义为
Var 和 Type 都被定义为 VAR ,它是任何有效的变量[a-zA-Z][a-zA-Z0-9_]
。除了添加一个虚拟令牌(例如**Decl** Type OptSquareBrackets
代替)之外,还有没有办法写这个没有冲突?从这条规则中,我得到 1 个 shift/reduce 和 1 个 reduce/reduce 警告。
compiler-construction - 使用 yacc 构建符号表时如何考虑范围?
我的 yacc 解析器创建了一个符号表,但我需要考虑范围。我该怎么做?我听说过当你退出作用域时,符号表是如何被破坏的。如何做到这一点仍然不是很清楚。
yacc - 为什么我在“)”而不是“(”上有轮班减少/冲突?
我有类似的语法
和
和 (var)
我的规则是这样的
问题是它似乎无法判断 ) 是否属于%(CommaLoop)
或% (val)
但它抱怨 ) 而不是 (。到底是什么?它不应该抱怨(
吗?我应该如何修复错误?我认为制作%(
令牌是一个很好的解决方案,但我想$(
在执行此操作之前确定为什么不是错误。