如何使用EBNF语法解析注释

5
定义语言解析器的语法时,如何处理可能出现在文本中任意位置的注释(例如 /*....*/)?在标记内部构建语法似乎在结构化情况下非常有效,但是注释会使一切变得复杂。您是否需要将文本分成两个步骤进行解析?首先删除这些项目,然后拆分代码的实际结构?谢谢。
2个回答

4

通常情况下,注释在主要语法范围之外由词法分析器处理。实际上,它们(通常)被视为空白。


2

一种方法是使用单独的词法分析器。另一种更加灵活的方式是在当前上下文中将所有类似于令牌的条目(关键字、词汇元素等)与隐式空格前缀进行修改。这就是大多数现代Packrat解析器处理空格的方式。


我在解析您的建议时遇到了困难 :-). 在 EBNF 令牌规则中,例如 hash = "#" ;,如何修改以包括“隐式空格前缀”? 隐式通常意味着从某些东西推断出来,而显式则意味着规则被更改以指定前缀,例如 hash = [WS] "#" ;。一个简单的语法示例会有所帮助。 - Dave
@Dave,我使用的规则(不一定是最好的,可以随意尝试)是向任何令牌节点添加空格,例如对于您的hash =“#”,此转换将产生hash =[whitespace]*“#”,并且对于您可能从PEG表达式中隐式提取的所有令牌节点都是如此(例如,如果您有一个表达式atom = {“(”[expr]“)”} / ...,则将具有两个隐式令牌节点“(”“)”,其中两者都添加了空格。您可以在此处查看我的实现细节:https://github.com/combinatorylogic/mbase/blob/master/src/l/lib/parsing/compiler.al - SK-logic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接