涉及正则表达式时 grako 中的空白处理

Whitespace handling in grako when regular expressions are involved

我正在尝试编写 grako 风格的 ebnf 语法。我注意到在尝试解析正则表达式时,生成的解析器似乎并没有超越 whitespaces 或注释。

文档就该主题说明了以下内容

Unlike other expressions, this one does not advance over whitespace or comments. For that, place the regexp as the only term in its own rule.

然后我创建了一个只有一个正则表达式规则的简单语法。正则表达式也是该规则中的唯一术语。

@@eol_comments :: ?/(#[^\r\n]*)|(\/\/[^\r\n]*)/?
@@comments :: ?/\s*\/\*(.|[\r\n])*?\*\//?

Start     = NameList $;
NameList  = { Name } ;
Name      = /[a-zA-Z_][a-zA-Z0-9_]+/ ;

生成的解析器在输入“abc\ndef”和"abc\ndef" 时失败。第一个在最开始,第二个在第一个换行符,space 或注释。

它只出现在正则表达式中,其他规则可以正常工作,例如如果名称定义为

Name      = 'abc' | 'def' ;

然后一切正常,上述输入成功解析。

我怎样才能改变行为,使语法超越白色 space 和评论?

附加信息:

上述输入的痕迹:

<Start
<1:1>abc

<NameList<Start
<1:1>abc

<Name<NameList<Start
<1:1>abc

>'abc' /[a-zA-Z_][a-zA-Z0-9_]+/
<1:4>

>Name<NameList<Start
<1:4>

<Name<NameList<Start
<1:4>

!'' /[a-zA-Z_][a-zA-Z0-9_]+/
<1:4>

>NameList<Start
<1:4>

!Start
<1:1>abc

<Start
<1:1> abc

<NameList<Start
<1:1> abc

<Name<NameList<Start
<1:1> abc

!'' /[a-zA-Z_][a-zA-Z0-9_]+/
<1:1> abc

>NameList<Start
<1:1> abc

!Start
<1:1> abc

我使用以下命令生成了解析器:

grako --generate-parser --outfile parser.py test.ebnf

我也试过使用 -w 选项指定 whitespaces(/\s+/ 和 /[ \t\n\r]+/ 但这并没有改变行为)

并使用以下方式启动解析器:

python parser.py eztest.txt Start -t

以大写字母开头的规则名称在 Grako 中很特殊。正如文档所解释的那样,它们在开始解析之前不会在空格上前进。

更改语法中的规则名称,使其以小写字母开头,这样应该没问题。

为什么不让用户选择驼峰式或 Python 式规则名称?

  • 这是一个简单且易于实施的设计选择,在语言的词汇方面具有很大的灵活性
  • 预计 Python 程序员会对 Python 风格的名称感到满意
  • 计算机语法和解析器的传统是对规则名称使用小写字母