javascript - Jison/Flex : Trying to capture anything (. *) 位于两个 token 之间但有问题

标签 javascript parsing bison flex-lexer jison

我目前正在开发一个小型 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”关键字作为捕获的一部分来完成这项工作。

这是我的 grammar 的链接和lexer文件。

如果您能提供解决我问题的见解,我将不胜感激!如果我没有清楚地解释我的问题,请告诉我,我会尽力澄清! 非常感谢!

我也很乐意接受任何有关如何清理语法的建议。我对这些东西还很陌生,感觉我的东西现在一团糟:)

最佳答案

很容易匹配一个字符串,但不包括 end 的第一个实例:

([^e]|e[^n]|en[^d])*

(它甚至不需要非贪婪的重复。)

但是,这不是您想要的。包含的 JavaScript 可能包括:

  • 名称恰好包含字符 end(tendency)的变量

  • 注释(/* 取值到行尾*/)

  • 字符串 (if (word == "end"))

  • 事实上,还有单词 end 本身,它不是 js 中的保留字。

确实,唯一干净的解决方案是能够 lex javascript。幸运的是,您不必精确地执行此操作,因为您没有解释它,但即便如此,这仍然是一项工作。与其他类似语言一样,JavaScript 词法分析中最烦人的部分是识别何时 / 是正则表达式的开头,何时只是除法;要做到这一点需要大部分 JavaScript 解析器,特别是因为它还与分号规则交互。

要处理包含的 javascript 实际上可能使用名为 end 的变量这一事实,据我所知,您有几个选择:

  1. 记录 end 是保留字的事实。

  2. 仅当 end 出现在括号之外以及语句可能开始的位置时才识别它(如果您最终构建了足够的 JS 解析器来正确识别正则表达式,则不会太困难)

  3. 仅当 end 单独出现在一行中时才识别它。

最后一个选择确实会大大简化您的问题,因此您可能需要考虑一下,尽管它并不是非常优雅。

关于javascript - Jison/Flex : Trying to capture anything (. *) 位于两个 token 之间但有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23399201/

相关文章:

c - 如何解析C中的简单字符串?

c - flex bison C lex yacc 扫描字符串缓冲区

c - 建立 Bison 语法时,终端上显示了太多无用的规则

c - 弹性 Bison : Building C Compiler - Line number in error message

javascript - 如何将顶点法线和面法线传递给 Three.js 着色器?

javascript - 从文件名中删除扩展名类型

java - Android 用 YQL 数据解析 XML

javascript - 如何创建一个不会破坏附加到模板的事件的 JavaScript 模板引擎?

javascript - 名称 "document"在当前上下文中不存在,在布局页面中

ios - Swift 中的正则表达式?