【发布时间】:2011-09-26 13:38:19
【问题描述】:
在为语言解析器定义语法时,您如何处理文本中在任何位置可能出现的诸如 cmets(例如 /* .... */)之类的东西? p>
当事物结构化时,从标签中的标签构建语法似乎效果很好,但 cmets 似乎什么都扔了。
您是否只需分两步解析文本?首先删除这些项目,然后再分解代码的实际结构?
谢谢
【问题讨论】:
标签: parsing context-free-grammar ebnf
在为语言解析器定义语法时,您如何处理文本中在任何位置可能出现的诸如 cmets(例如 /* .... */)之类的东西? p>
当事物结构化时,从标签中的标签构建语法似乎效果很好,但 cmets 似乎什么都扔了。
您是否只需分两步解析文本?首先删除这些项目,然后再分解代码的实际结构?
谢谢
【问题讨论】:
标签: parsing context-free-grammar ebnf
通常,词法分析器会在主语法范围之外处理 cmets。实际上,它们(通常)被视为空白。
【讨论】:
一种方法是使用单独的词法分析器。另一种更灵活的方法是使用隐式空格前缀修改所有类似标记的条目(关键字、词法元素等),该前缀对当前上下文有效。这就是大多数现代 Packrat 解析器处理空格的方式。
【讨论】:
hash = "#" ; 等 EBNF 令牌规则中,如何修改它以包含“隐式空白前缀”?隐式通常意味着从某事推断,而显式意味着更改规则以指定前缀,例如,hash = [WS] "#" ;。一个小小的语法示例会有所帮助。
hash = "#",此转换将产生hash = [whitespace]* "#",对于您可能从 PEG 表达式中隐式提取的所有令牌节点也是如此(例如,如果您有一个表达式 atom = { "(" [expr] ")" } / ...,您将有两个隐式令牌节点 "(" 和 ")",并添加了空格两者都有。你可以在这里看到我的实现细节:github.com/combinatorylogic/mbase/blob/master/src/l/lib/parsing/…