问题标签 [jison]

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.

0 投票
2 回答
5973 浏览

javascript - 如何从 JISON 解析器中获取抽象语法树(AST)?

所以我通过JISON生成了一个解析器:

我的问题是,我现在如何检索 AST?我可以看到我可以针对输入运行解析器,但如果它有效,它只会返回 true,否则会失败。

作为记录,我正在使用 JISON:http: //zaach.github.com/jison/docs/

0 投票
1 回答
834 浏览

javascript - 野牛优先级(实际上使用 jison 但应该相同)

我正在使用 jison (相当于 Bison 的 javascript )并且我遇到了以下优先级问题。我将使用计算器演示 http://zaach.github.com/jison/try/来说明它

它按原样工作正常。优先级是

语法是

如果我将“*”行更改为

并将优先级更改为

它不再起作用了。不应该是一样的吗?这可能很有用,例如,如果希望最终获得一种代数语法,其中 2 x + 3 被解析为 (2x)+3。

谢谢!

0 投票
2 回答
321 浏览

bison - 隐式优先级

我正在阅读《Flex and Bison》一书以了解解析器生成器的工作原理,并且有示例:

并且在书中说,上面的语法通过使用单独的非终结符号具有隐含的优先级。但它是如何工作的?假设我们有以下示例:(1 + 3 * 2空格只是跳过)我们读取第一个令牌1,它将被推送到堆栈,NUMBER或者它会通过语法“冒泡”多长时间termfactor从哪个语法规则检查下一个标记?为什么这种语法乘法的优先级高于加法?

0 投票
2 回答
925 浏览

javascript - 如何使用 Node.js 运行 Jison 测试?

尝试运行 Jison 单元测试,但命令失败。我该如何解决?

0 投票
1 回答
1373 浏览

programming-languages - 如何从 AST 节点获取行号(Jison)

我正在使用 Jison 构建一个简单的计算器语言,其中包含变量。我希望这些变量的工作方式类似于 JavaScript,即您必须var第一次使用关键字对其进行初始化。用我的语言,如果变量重新初始化,我想显示一个错误。

我的问题是,如何获取 AST 节点的行号?在我的语法文件中,我可以将解析器中的行号传递给我的AssignVariable对象,但我想知道是否有更好的方法来做到这一点?

我还需要编译器中其他节点的行号,以进行其他类型的错误检查。

这个问题的一个更高级的结论可能是:使用 Jison(或类似的)检测和处理编译时错误的最佳方法是什么?

0 投票
1 回答
653 浏览

javascript - 如何避免语法冲突

我有一个语法文件 — https://github.com/itrelease/fubar-script/blob/jsast/src/grammar.js但我遇到了冲突,我真的不知道如何解决这个问题。如果有人可以向我解释这将是有帮助的。

此规则会产生冲突

0 投票
1 回答
335 浏览

bison - 来自 Expression Interpreter 演示的 Expression AST Parser

我正在尝试将这个“计算器”Jison 示例修改为表达式解析器而不是表达式解释器。我想输出一个描述表达式的 JSON 对象,而不是立即评估它。

  • 我试图修改演示以返回带有运算符和操作数作为元素的 javascript 数组。
  • 当我解析时1 + 2,我希望得到一个字符串化为的 JSON 数组['+', 1, 2]。相反,我得到1.
  • 这似乎与 NUMBER 动作直接相关——无论我告诉什么返回就是我得到的全部。
  • 但是,如果我尝试解析“1 2 + 3”,它确实会出现语法错误。

(我不关心我是否在一个有用的AST模型中表示表达式,我只是想学习Jison)

0 投票
1 回答
2152 浏览

bison - 转义字符语法

我想为允许转义标记分隔符的标记语言创建 Jison (Bison) 语法。

这些将是有效的:

这些示例可能会被解释为以下内容(以 JSON 表示):

转义[]\,是最少的,但允许任何可打印字符转义可能是有意义的,即使转义是不必要的。

如果不支持转义不可打印的字符,那就太好了。也就是说,\一行末尾的 a 是非法的。正则表达式可能会免费提供,.因为它可能不包含换行符,但它也应该发生在其他不可打印的字符上。

很难用谷歌搜索,因为它与 Bison 定义等中转义文字字符的大量结果混在一起。

在 Bison 定义的语言中支持转义字符的最优雅方法是什么?

编辑

这是我到目前为止所拥有的,可以在 Jison 上进行测试,但它不起作用(1如果有的话,只是返回)而且我不希望文本会原封不动地到达 - 这需要第二遍。这是可以避免的吗?

0 投票
1 回答
7410 浏览

bison - 语法规范解决 Shift/Reduce 冲突

我正在使用 Jison (Bison) 创建一个简单的标记语言。我显然对此很陌生,但细微的变化效果很好。我只是不明白 S/R 冲突的根源。

两个词法分析器操作(具有不同的开始条件)返回“文本”似乎并不重要,我喜欢这个,因为它似乎允许语法有更少的规则,而且给用户的错误消息是一致的。无论上下文如何,我都尝试使“文本”规则通用,并且我还尝试为每个标记赋予不同的名称,但是当它们一起出现时,它似乎对 S/R 冲突没有任何影响。

解析器应该创建一个带有纯文本、子数组和各种特殊节点的 json 对象。

规格:

警告:

不同的生成器算法或多或少都有问题,但它们似乎都有问题。

谢谢!

0 投票
2 回答
1882 浏览

javascript - 向 JISON 添加声明

我这里有一个 JISON 计算器示例的稍微修改过的版本:

!请注意操作员定义的细微差别。我试图从外部定义fact函数而不是内联。

截至目前,它在运行时告诉我fact is not defined。我怎样才能解决这个问题?另外,为什么计算器示例在阶乘定义周围使用两个大括号{{ /*like so*/ }}