【问题标题】:How to parse comments with EBNF grammars如何使用 EBNF 语法解析注释
【发布时间】:2011-09-26 13:38:19
【问题描述】:

在为语言解析器定义语法时,您如何处理文本中在任何位置可能出现的诸如 cmets(例如 /* .... */)之类的东西? p>

当事物结构化时,从标签中的标签构建语法似乎效果很好,但 cmets 似乎什么都扔了。

您是否只需分两步解析文本?首先删除这些项目,然后再分解代码的实际结构?

谢谢

【问题讨论】:

    标签: parsing context-free-grammar ebnf


    【解决方案1】:

    通常,词法分析器会在主语法范围之外处理 cmets。实际上,它们(通常)被视为空白。

    【讨论】:

      【解决方案2】:

      一种方法是使用单独的词法分析器。另一种更灵活的方法是使用隐式空格前缀修改所有类似标记的条目(关键字、词法元素等),该前缀对当前上下文有效。这就是大多数现代 Packrat 解析器处理空格的方式。

      【讨论】:

      • 我无法解析您的建议 :-)。在 hash = "#" ; 等 EBNF 令牌规则中,如何修改它以包含“隐式空白前缀”?隐式通常意味着从某事推断,而显式意味着更改规则以指定前缀,例如,hash = [WS] "#" ;。一个小小的语法示例会有所帮助。
      • @Dave,我正在使用的规则(不一定是最好的,请随意尝试)是向任何令牌节点添加空格,例如,对于您的 hash = "#",此转换将产生hash = [whitespace]* "#",对于您可能从 PEG 表达式中隐式提取的所有令牌节点也是如此(例如,如果您有一个表达式 atom = { "(" [expr] ")" } / ...,您将有两个隐式令牌节点 "("")",并添加了空格两者都有。你可以在这里看到我的实现细节:github.com/combinatorylogic/mbase/blob/master/src/l/lib/parsing/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多