ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript – 你如何在Jison中匹配零个或多个令牌?

2019-07-09 06:35:54  阅读:220  来源: 互联网

标签:javascript parsing parser-generator jison bnf


我正在Jison中编写一个简单的表达式解析器,允许任意数量的换行符跟在表达式中的二元运算符.到目前为止这是我的语法:

{
    "operators": [
        ["left", "+", "-"],
        ["left", "*", "/", "%"]
    ],
    "bnf": {
        "program": [
            ["statement EOF", "return $1;"]
        ],
        "statement": [
            ["expression newlines", "$$= $1 + ';';"]
        ],
        "expression": [
            ["NUMBER",                           "$$= yytext;"],
            ["expression + expression",          "$$= $1 + ' + ' + $3;"],
            ["expression - expression",          "$$= $1 + ' - ' + $3;"],
            ["expression * expression",          "$$= $1 + ' * ' + $3;"],
            ["expression / expression",          "$$= $1 + ' / ' + $3;"],
            ["expression % expression",          "$$= $1 + ' % ' + $3;"],
            ["expression + newlines expression", "$$= $1 + ' + ' + $4;"],
            ["expression - newlines expression", "$$= $1 + ' - ' + $4;"],
            ["expression * newlines expression", "$$= $1 + ' * ' + $4;"],
            ["expression / newlines expression", "$$= $1 + ' / ' + $4;"],
            ["expression % newlines expression", "$$= $1 + ' % ' + $4;"]
        ],
        "newlines": [
            ["NEWLINE",          ""],
            ["newlines NEWLINE", ""]
        ]
    }
}

正如您所看到的,我正在为每个二元运算符编写两条规则.在我看来,这是多余的.我宁愿生产一个匹配零个或多个NEWLINE标记(Kleene star)而不是一个或多个标记(Kleene plus)的产品.你怎么在Jison做这个?

解决方法:

我使用Jison而忽略了空格(包括换行).

我的%lex中的第一行是:

\s+   /* ignore */

但如果你不愿意,你不必这样做.
尝试这些方面的东西:

"expression": [
            ["NUMBER",                           "$$= yytext;"],
            ["expression + expression",          "$$= $1 + ' + ' + $3;"],
            ["expression - expression",          "$$= $1 + ' - ' + $3;"],
            ["expression * expression",          "$$= $1 + ' * ' + $3;"],
            ["expression / expression",          "$$= $1 + ' / ' + $3;"],
            ["expression % expression",          "$$= $1 + ' % ' + $3;"],
            ["expression newlines",              "$$= $1"],
            ["newlines expression",              "$$= $2"]
        ],

这应该允许任何表达式之前/之后的任何数量的新行.

标签:javascript,parsing,parser-generator,jison,bnf
来源: https://codeday.me/bug/20190709/1410472.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有