【问题标题】:Ignore whitespace with PEG.js使用 PEG.js 忽略空格
【发布时间】:2011-11-24 12:37:20
【问题描述】:

我想用我的语法忽略 空格新行,因此PEG.js 输出中缺少它们。此外,括号内的文字应在新数组中返回。

语法

start
  = 'a'? sep+ ('cat'/'dog') sep* '(' sep* stmt_list sep* ')'

stmt_list
  = exp: [a-zA-Z]+ { return new Array(exp.join('')) }

sep
  = [' '\t\r\n]

测试用例

a dog( Harry )

输出

[
   "a",
   [
      " "
   ],
   "dog",
   [],
   "(",
   [
      " "
   ],
   [
       "Harry"
   ],
   [
      " "
   ],
   ")"
]

我想要的输出

[
   "a",
   "dog",
   [
      "Harry"
   ]
]

【问题讨论】:

    标签: javascript parsing lexical-analysis peg


    【解决方案1】:

    你必须更多地分解语法,使用更多的“非终结符”(不确定这是否是你在 PEG 中所说的):

    start
      = article? animal stmt_list
    
    article
      = article:'a' __ { return article; }
    
    animal
      = animal:('cat'/'dog') _ { return animal; }
    
    stmt_list
      = '(' _ exp:[a-zA-Z]+ _ ')' { return [ exp.join('') ]; }
    
    // optional whitespace
    _  = [ \t\r\n]*
    
    // mandatory whitespace
    __ = [ \t\r\n]+
    

    感谢您提出这个问题!

    编辑: 为了提高可读性,有两个产生式:___

    【讨论】:

    • 谢谢!只有一件事:试试dog( Harry )。文章应该是可选的。将?'a'(在文章中)带到article(在开始)仍然会返回一个空字符串...这与PEG.js 有关吗?
    • 我想也许让“开始”规则有“文章?”有助于。那么,“文章”规则本身可能就是'a' sep*
    • 那么它也将允许adog( Harry )。无论如何,也许我使用了错误的工具......我有一个 xdot grammar(xdot 基于点),我想解析并绘制到画布上。您是否知道评估文件语法的任何其他节省时间的方法(除了编写我自己的解析器或使用像 canviz 这样的东西(功能不足))?
    • 至于如何解析dot 文件,语法很复杂,我认为您需要一个“真正的”解析器。当然不必是 PEG。你可以用 JavaScript 编写自己的递归下降解析器,或者使用类似 Jison 的东西。我没有 PEG 解析的经验,但我认为这很有趣。 :-)
    • 不是[' '\t\r\n],而是[ \t\r\n][' '\t\r\n] 会赶上'
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多