问题标签 [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 回答
517 浏览

parsing - 如何检测 Jison 中的新行?

我有一段 Jison 代码,如下所示:

这就是我的输入目前的样子(我从我计划拥有的最基本的构造开始,我想从那里构建它):

我遇到的问题是未检测到新行。它总是进入line content并且从不进入line NL content。稍后我想解析一些看起来更像这样的东西:

将来这会变得更加复杂,但我最初的想法是将其分解为每行(在许多情况下,新行将用作分隔符)。我对这些东西完全陌生,所以我可能对如何解决这个问题有一个完全错误的想法。所以我的问题是如何检测新行?此外,如果对我正在尝试做的事情有更好的方法,任何建议都非常受欢迎。谢谢。

0 投票
0 回答
105 浏览

javascript - 在 Jison/Javascript 中解析字符表示

我在 Jison 中编写了一个 C++ 语法,并且我已经成功地用这个正则表达式正确地检测了字符文字:

然后像这样将它添加到 AST 中:

但是,对于输入字符串文字'\n',值的$1计算结果是它的字符串表示"'\\n'",而不是它的实际字符值"\n",这正是我想要的。

有什么方法可以告诉 Jison 我想要字符值而不是它的表示?否则,在 Javascript 中将具有字符表示的字符串解析为其对应的字符值的最佳方法是什么,例如解析"\\t""\t"?

0 投票
1 回答
205 浏览

parsing - 为什么我在 Jison 中的语法错误没有被“传播”?

这是我拥有的代码:

它用于解析这种代码:

进入这种 JSON:

但是我没有收到语法错误。当我去Jison 演示并尝试解析5*PI 3^2时,我收到以下错误:

这是预期的。但是当我更改我希望从中解析的代码的最后一行时:

类似于

我收到以下错误:

我将其追溯到生成的解析器代码,如下所示:

所以这让我相信我的代码结构和处理解析的方式有问题,但我不知道那可能是什么。

似乎它可能与错误恢复有关。如果这是正确的,那应该如何使用?我是否应该将“错误”规则向上添加到每个元素一直到源根?

0 投票
0 回答
113 浏览

parsing - 如何从 Jison 中的操作中“添加”解析错误?

有没有办法从 Jison 的动作中添加解析错误?说我有这样的事情:

我希望“抛出”被解析器识别并为我提供这样的错误(这通常是标准的解析错误,由规则生成):

谢谢。

0 投票
1 回答
67 浏览

parsing - 用于检测段落的简单 JISON 解析器

看在上帝的份上!!如何编写一个简单的jison语法来识别带有段落的文档???我正在使用以下语法:

对于测试我正在使用:

从我的语法中可以看出,我想要的是一个段落变成了单词数组。

在 JISON 网站上尝试这个,它让我一直在给:

而我所期望的是

谁能帮帮我???

0 投票
1 回答
110 浏览

parsing - JISON Recursion 在 Token 之后读取整个输入文本

我对解析器/cfg 或 jison 非常陌生。我希望我的语法做的是:

  1. 阅读 Token ADDRESS 到 EOF 之后的所有内容

  2. “ADDRESS TO EOF”之间可以有多个 ADDRESS 令牌(从步骤 1 开始)

我的示例输入如下所示:

我期待的输出是

我正在尝试的代码是

我认为应该有更多的表达来实现输出,就像other ADDRESS other引发 S/R 冲突一样。谁能建议我如何在第一个ADDRESS令牌出现之前跳过所有输入,而不是将所有其他输入放入$$. 谢谢。

0 投票
1 回答
310 浏览

javascript - 如何使用 Jison lexer 返回多个令牌

如果标题不够清楚,我对词法分析和解析很抱歉。

基本上,我使用 Jison 来解析一些文本,并且试图让词法分析器理解缩进。这是有问题的一点:

到目前为止,几乎所有这些都按预期工作。一个问题是我尝试返回一组DEDENT标记的行。似乎 Jison 只是将该数组转换为一个字符串,这导致我得到一个解析错误,例如Expecting ........, got DEDENT,DEDENT.

我希望我能做的就是手动将一些DEDENT令牌推送到堆栈上。也许有类似的功能this.pushToken('DEDENT')或类似的东西。但是 Jison 文档不是很好,我可以使用一些帮助。

有什么想法吗?

编辑:

在查看生成的解析器代码后,我似乎已经能够解决这个问题。这似乎是可行的......

这会诱使词法分析器对堆栈中的每个输入使用完全相同的输入来执行另一个操作DEDENT,从而允许它添加适当的 dents。但是,感觉很糟糕,我担心可能会出现无法预料的问题。

如果有人对更好的方法有任何想法,我仍然会喜欢它。

0 投票
0 回答
281 浏览

parsing - 简单调用表达式/lambda语法中的野牛移位/减少冲突

我有一个转变/减少冲突,我无法弄清楚它为什么会发生,以及如何解决它。

鉴于此语法:

我希望能够解析这样的表达式(不详尽):

但是我在这里收到了移位/减少冲突:

我以为我明白何时发生班次/减少,但这个人正在逃避我,所以我需要接受教育。

我尝试更多地了解可用的优先级指令,left, right, precedence, nonassoc但是我尝试使用它们并不能解决歧义,而且它们也给了我warning: useless precedence and associativity,所以我做错了。希望答案对其他人来说是显而易见的。

我最初认为这与 Lambdas 以它开头()和 CallExpressions 以它结尾的事实有关,但是将这些标记更改为不冲突没有任何区别。

/掌脸

0 投票
0 回答
214 浏览

javascript - 使用 Jison(或 Bison)标记和解析字符串对

我正在尝试使用Jison(Bison 的 node.js 实现)构建一个解析器来解析一个如下所示的文件:

目标

这是一个存储重定向路径/URL 的文件。当需要知道如何重定向用户时,还有其他脚本会引用此文件。目标是开发一个解析器,每次有人尝试保存文件时我都可以运行该解析器。这样,我可以确保它的格式始终正确。

基本上,---块内的所有内容以及任何空行都将被忽略。剩余的每一行代表一个“重定向记录”。

对于每个“重定向记录”,它必须具有以下结构:

INPUT_URL_OR_PATH <space> OUTPUT_URL_OR_PATH

换句话说,必须有一个空格分隔两个字符串。

到目前为止我做了什么

我对语法/解析很陌生,所以请多多包涵。

我勾勒出来的语言语法是这样的:

终端符号包括:EOF, INPATH, SPACE, OUTPATH.

不幸的是,我什至还没有实现它,因为我在开发我的词法分析器时遇到了麻烦。

这是我的jison文件的样子:

显然,我离完成还很远。我目前同时被困在几件事上。

我坚持的事情

  1. 能够跳过空行;
  2. 标记INPATH, SPACE, OUTPATH, and;
  3. 在语言语法部分使用左递归而不是右递归(有什么区别?我做得对吗?这里最好的选择是什么?)。

换句话说,我不知道我在做什么,并且真的可以使用一些帮助。

编辑我将尝试做更多的研究,并希望最终回答我自己的问题。

0 投票
1 回答
439 浏览

bison - 如何在 Yacc 中强制转换?

我有以下结构作为 yacc 语法的一部分(或者更确切地说是 jison,但两者共享相同的公共基础):

这当然是一个简化的例子,但它应该给出一般的想法并显示实际的问题。我想分别将, ,等结构解析为Foo[], 。Foo*Foo*[](Foo)[](Foo)*((Foo)*)[]

然而,Yacc 正确地抱怨它在遇到以下构造时不知道该怎么做:

它可以被解析为func (A, B) => (C[])(func (A, B) => C)[]。我当然希望它是第一个(因为我有( Type )第二种情况的构造)。如果遇到这种情况,有什么方法可以告诉 yacc(或 jison)我想换班吗?