问题标签 [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.
parsing - 在 yacc 中允许变长列表
我希望能够解析以下结构:
我正在使用 flex 进行标记,并且效果很好。我正在使用 yacc (bison) 进行解析。
允许这种结构的推荐方法是什么?现在,在我的 test.y 文件中,我有:
我怀疑 strcat() 是一个非常非常糟糕的主意。当谈到 lex/yacc(大约 3 小时的经验)时,我是一个真正的新手,所以在手腕上轻轻一拍,以及指向正确方向的指针会很棒。
编辑:这样做的目的是让我为外部应用程序构建测试工具。词法分析/解析将用于解释用户提供的测试脚本。一个命令允许用户向应用程序发送消息,然后我读取多行响应并与用户在脚本中提供的可变长度字符串列表进行比较。我在上面发布的片段是我认为让用户定义可能的响应的方式。
例如:
或者
c - 如何使用 Bison/Yacc 和递归规则构建数组
使用 Bison,我想出了如何将所有内容放入一个长字符串中,如下所示:
和:
但问题是我将不得不在第二条规则中再次拆分 $2 来解析它。有没有办法填充数组而不是仅仅使用连接?我会以错误的方式解决这个问题吗?
如果我需要构建一个有意义的链接列表之类的东西,只是不确定绑定到 arg_list 的正确方法是什么,然后清理内存。
c - 使用 Bison/Yacc 在 %union def 中包含结构
我试图包含一个结构作为与 Bison 联合的一部分,但在 %union 中的“结构节点参数”上出现错误:
编码:
有人知道我在做什么错吗?
c - Flex(lex) 和 Bison(yacc) 的错误处理
来自野牛手册:
在每个输入为一行的简单交互式命令解析器中,允许 yyparse 在错误时返回 1 并让调用者在发生这种情况时忽略输入行的其余部分(然后再次调用 yyparse)可能就足够了。
这几乎是我想要的,但我在上班时遇到了麻烦。基本上,我想检测 flex 中的错误,如果检测到错误,让 Bison 丢弃整行。我现在拥有的东西不能正常工作,因为我的命令仍然被执行:
在我的野牛文件中:
在我的 Flex 中:
c - 如何使用 Flex/Lex 和 Yacc/Bison 进行变量替换
维基百科的插值定义 我只是在学习 flex / bison,我正在用它编写自己的 shell。我正在尝试找出一种进行变量插值的好方法。我最初的方法是对我的主目录或 $myVar 之类的东西进行 flex 扫描,然后使用查找函数将 yyval.string 设置为返回的内容。我的问题是,当文本出现一个标记时,这对我没有帮助:
我对变量的 lex 定义:
然后在我的语法中,我有类似的东西:
有人知道处理这种事情的好方法吗?我对这一切都错了吗?
parsing - Parser/Lexer 忽略不完整的语法规则
我有一个用 ocamlyacc 和 ocamllex 编写的解析器和词法分析器。如果要解析的文件过早结束,例如我忘记了行尾的分号,则应用程序不会引发语法错误。我意识到这是因为我正在提高和捕捉 EOF 并且这使得词法分析器忽略未完成的规则,但是我应该如何这样做来引发语法错误?
这是我当前的解析器(简化),
和lexxer(简化),
示例输入文件,
一种解决方案是,在命令规则的末尾添加一个递归调用给自身,并添加一个空规则,所有这些都构建一个列表以返回主程序。我想我可能将 Eof 解释为期望和结束条件,而不是词法分析器中的错误,这是正确的吗?
c - 对 Bison/YACC 语法的困惑
使用以下语法,我收到这种输入的语法错误:
我认为这可能与前瞻的工作方式有关,但这是我的第一个语法,我有点困惑为什么它不能这样工作:external_cmd GT WORD 是重定向,redirect 是命令,命令是命令,因此输入命令 NEWLINE 应该可以工作。
语法的主要规则:
引发错误标记时的调试/详细输入:
更新:
external_cmd 是:
yacc - 野牛移位/减少问题将添加操作移动到子表达式中
最初在示例中是这样的
我希望它“更简单”所以我写了这个(我意识到它会为加法和减法做'+'。但这是一个例子)
现在我得到一个移位/减少错误。它应该完全相同-_-(对我来说)。我需要做什么来解决这个问题?
编辑:说清楚。第一个没有警告/错误。我使用 %left 来设置优先级(我将使用 %right 来表示 = 和其他正确的操作)。但是,当进入子表达式时,它似乎并不适用。
yacc - yacc/bison 组合字题
我有一个如下的 if 语句
有效,太好了!但我输入了
它也有效:| 我该如何解决?以上应该是 var 名称而不是 if 语句
-edit-没关系,我想通了
c - 用野牛解析
我从 O'Reilly 购买了 Flex & Bison,但我在实现解析器时遇到了一些麻烦(将事物分解为令牌没什么大不了的)。
假设我有一个巨大的二进制字符串,我需要做的就是将这些位相加 - 每个位都是一个标记:
1101010111111
或者就此而言,没有“操作”的令牌集合。
这样的语法是否正确?
或者有更好的方法吗?