- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在开发一个小型 dsl,与 Rabl 不同。我正在努力执行我的一项规则。在讨论这个问题之前,我将解释一下我的语法/语法。在我的小语言中,您可以定义属性、对象/数组 block 或自定义 block (这些都用于构建 json 对象/数组)。 “自定义 block ”可以是包含我的标准表达式(属性、对象/数组 block 等)或一些 JavaScript 的 block 。这些表达式是这样写的 -
-- An object block
object @model
-- A property node
property some, key(name="value")
-- A custom node
object custom_obj as
property some(name="key")
end
-- A custom script node
property full_name as (u)
// This is JavaScript
return u.first_name + ' ' + u.last_name;
end
end
我遇到的问题是我的自定义脚本节点。我正在严格定义脚本标记,以便 JISON 可以正确捕获 block 内的内容。在我的词法分析器中,我目前有...
# script_param is basically a regex to match "(some_ident)"
{script_param} { this.begin('js'); return 'SCRIPT_PARAM'; }
<js>(.|\n|\r)*?"end" %{
this.popState();
yytext = yytext.substr(0, yyleng - 3).trim();
return 'SCRIPT';
%}
该 SCRIPT token 基本上会匹配 (u) 之后直到(并包括)结束 token (通常结束一个 block )的任何内容。我真的不喜欢这个,因为我通常的 block 终止符(结束)实际上是脚本 token 的一部分,这对我来说完全是黑客行为。不幸的是,我无法找到更好的方法来捕获 (..) 和 end 之间的任何内容。我尝试编写一个正则表达式来捕获以“;”结尾的任何内容,但是当我的 dsl 代码中有多个脚本节点时,这会带来问题。我只能通过将“end”关键字作为捕获的一部分来完成这项工作。
如果您能提供解决我问题的见解,我将不胜感激!如果我没有清楚地解释我的问题,请告诉我,我会尽力澄清!非常感谢!
我也很乐意接受任何有关如何清理语法的建议。我对这些东西还很陌生,感觉我的东西现在一团糟:)
最佳答案
很容易匹配一个字符串,但不包括 end
的第一个实例:
([^e]|e[^n]|en[^d])*
(它甚至不需要非贪婪的重复。)
但是,这不是您想要的。包含的 JavaScript 可能包括:
名称恰好包含字符 end
(tendency
)的变量
注释(/* 取值到行尾*/
)
字符串 (if (word == "end")
)
事实上,还有单词 end
本身,它不是 js 中的保留字。
确实,唯一干净的解决方案是能够 lex javascript。幸运的是,您不必精确地执行此操作,因为您没有解释它,但即便如此,这仍然是一项工作。与其他类似语言一样,JavaScript 词法分析中最烦人的部分是识别何时 / 是正则表达式的开头,何时只是除法;要做到这一点需要大部分 JavaScript 解析器,特别是因为它还与分号规则交互。
要处理包含的 javascript 实际上可能使用名为 end
的变量这一事实,据我所知,您有几个选择:
记录 end
是保留字的事实。
仅当 end
出现在括号之外以及语句可能开始的位置时才识别它(如果您最终构建了足够的 JS 解析器来正确识别正则表达式,则不会太困难)
仅当 end
单独出现在一行中时才识别它。
最后一个选择确实会大大简化您的问题,因此您可能需要考虑一下,尽管它并不是非常优雅。
关于javascript - Jison/Flex : Trying to capture anything (. *) 位于两个 token 之间但有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23399201/
可以在以下位置找到以下代码片段: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* %{
我是一名优秀的程序员,十分优秀!