- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究模板系统的语法。我在构建中遇到了障碍,我不太清楚如何解决这个问题。我简化了测试用例,以最好地强调我正在做的事情。
示例字符串:
(foo)
- 作品(foo())
- 失败Expecting 'parenEnd', got 'parenInterior'
foo (foo) bar
foo (foo(function() { console.log('stuff'); })) bar
foo (foo.bar.baz("stuff")) bar
规则是在括号内,任何字符都可以。我不需要验证,也不需要确保它们匹配正确的格式。另一方面,根据我的理解,为了使解析器正常工作,我确实需要跟踪打开和关闭 (
和)
否则,词法分析器无法知道一个括号语句从哪里开始,另一个语句从哪里结束,例如 (foo()) (bar)
。为了跟踪这一点,我正在使用 paren
每当在括号语句内击中括号时,启动条件都会增加一个值,并在出现闭括号时将其删除。
问题是它不起作用。罪魁祸首是它似乎从未击中我的 <paren>")"
规则,但我却点击了 <paren>"("
规则就好了。它们在语法上看起来是相同的,为什么一个有效而另一个无效?
语法
%lex
%x paren
%%
\s+ /* skip whitespace */
<INITIAL>"(" { this.begin("paren"); parenCount = 1; return "parenStart"; };
<paren>"(" { console.log("parenStart", parenCount); parenCount++; return "parenInterior"; };
<paren>")" { console.log("parenEnd", parenCount); parenCount--; if (parenCount === 0) { this.popState(); return "parenEnd"; } else { return "parenInterior"; } };
<paren>[^\)\(]+ { console.log(this); return "parenInterior"; };
<<EOF>> return 'EOF';
. return 'INVALID';
/lex
%start expressions
%% /* language grammar */
expressions
: parenStart parenInterior parenEnd { return $1 + $2 + $3; }
;
%%
parenCount = 0;
最佳答案
我相信您的问题是您的语法不接受标记的序列。如果我将语法更改为此,那么我会得到一些可以处理您在问题中显示的字符串的东西:
%lex
%x paren
%%
\s+ /* skip whitespace */
<INITIAL>"(" { this.begin("paren"); parenCount = 1; return "parenStart"; };
<paren>"(" { console.log("parenStart", parenCount); parenCount++; return "parenInterior"; };
<paren>")" { console.log("parenEnd", parenCount); parenCount--; if (parenCount === 0) { this.popState(); return "parenEnd"; } else { return "parenInterior"; } };
<paren>[^\)\(]+ { console.log(this); return "parenInterior"; };
<<EOF>> return 'EOF';
. return 'WHATEVER';
/lex
%start expressions
%% /* language grammar */
expressions
: whateverSeq parenStart parenInteriorSeq parenEnd whateverSeq EOF { return $1 + $2 + $3 + $4 + $5; }
;
parenInteriorSeq
: parenInterior
| parenInteriorSeq parenInterior -> $1.concat($2)
;
whateverSeq
: -> "" // Empty sequence.
| whatevers // One or more WHATEVER tokens.
;
whatevers
: whatever
| whateverSeq WHATEVER -> $1.concat($2)
;
%%
parenCount = 0;
那么嵌套括号就没有问题了。
显着变化:
将 INVALID
替换为 WHATEVER
。添加了在开始和结束处添加 WHATEVER
标记序列的规则。这允许有诸如 blah (foo) blah
之类的东西。
将 parenInterior
替换为 parenInteriorSeq
,以便您可以在括号内包含 parenInterior
标记序列。这是必要的,因为在像 (foo())
这样的字符串中,foo
是一个标记,下一个 (
是另一个标记,下一个 )
是另一个标记。因此,您必须接受 token 列表。
关于javascript - 使用 JISON 匹配但忽略嵌套括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26370901/
可以在以下位置找到以下代码片段:http://zaach.github.io/jison/demos/calc/ ,以及 jison 文档页面。阅读 jison、lex 和 flex 文档后 - 我仍
嗨,我是 JISON 的新手,并陷入了以下代码: 用于解析命令: project -a -n 我的代码如下: "project" {return 'PROJECTCOMMAND';} "-n
我使用 JISON 生成了一个解析器: %lex %x TEXT %% ("Project"|"project") {return 'PROJECTCOMMAND';} "-au" {return '
我现在在一个看起来很容易解决的问题面前坐了几个小时,但我就是无法解决它:/ 我正在 jison 中定义一种小型的类似 javascript 的语言。问题是参数规则和AssignStatement 规则
我正在尝试使用 Jison 编写解析器这将解析 javap 工具的输出。这是我的 .jison 文件的内容: %lex %x classfile %% "Classfile"
我正在尝试使用 Jison。 这是我的语法: var grammar = { lex:{ rules:[ ["\\s+", ""], ["
我正在努力了解 Jison。不过我有点麻烦。下面的解析器总是返回 [],不管你给它什么。 %lex %% "data"\s* return 'DATA' [A-Za-z][A-
我已经使用 Jison 编写了一个解析器,它能够通过运算符和 bool 运算支持处理类似 google 的搜索查询。目前,我很难弄清楚如何接受 AND OR 和 NOT 运算符之间的空格。任何帮助将不
我有一个简单的文件格式,我想用 jison 解析器生成器进行解析。该文件可以由任意顺序和数量的多个表达式组成。这是解析器的 jison 文件: /* lexical grammar */ %lex %
在尝试设置我的 Jison 语法时,我有: %left 'OR' 'AND' %% Expression: Operation ; Operation: Expression Oper
我正在研究模板系统的语法。我在构建中遇到了障碍,我不太清楚如何解决这个问题。我简化了测试用例,以最好地强调我正在做的事情。 示例字符串: (foo) - 作品 (foo()) - 失败Expectin
我正在尝试创建一种简单的脚本语言。一开始我只是想要类似的东西 i = 5; i += 3; out(i); 所以我为 jison 创建了以下语法: %lex %% \s+
我有一段 Jison 代码,如下所示: %lex %options flex %{ if (!('regions' in yy)) { yy.regions = []; } %} text
我正在使用 Jison 来添加新的自定义函数。从 Jison documentation 处的示例开始: { "lex": { "rules": [ ["
我希望为现有语言创建一个 JavaScript 解析器,该语言目前具有笨拙的“手工制作”C# 和 Java 解析器。我想使用 Jison,并且也一直在尝试学习 Bison 的基础知识。 我不确定如何回
我正在通读 jison documentation其中一个示例给出了匹配文件末尾 ( > ) 的词法分析器规则。但是,只有在以 JISON 格式编写语法时才能使用它。相反,我使用 JSON 格式来描述
在 JISON 中,有没有办法为单个作品解析字符串?例如,这个原始解析器根据多个产品(例如 ary)定义了一个主 expressions。 现在这会返回一个可以解析表达式的函数: var parser
我正尝试在我的编程语言中添加对数组的支持,但遇到了问题 Array : '[' Expr ("," Expr)* ']' {{ $$ = ['ArrayList', $1]; }}
有没有办法将数据传递给 Jison,以便它可以在解析期间引用它?作为起始案例,假设我们正在使用 calculator.jison并想传递给它一个对象,比如说 var parser = new jiso
我是词法分析和解析的新手,如果标题不够清晰,我很抱歉。 基本上,我使用 Jison 来解析一些文本,并尝试让词法分析器理解缩进。这是有问题的部分: (\r\n|\r|\n)+\s* %{
我是一名优秀的程序员,十分优秀!