我正在尝试编写一个 grako 风格的 ebnf 语法。我注意到,在尝试解析正则表达式时,生成的解析器似乎没有超过空格或注释。
该文档在该主题上说了以下内容
与其他表达式不同,这个表达式不会超过空格或注释。为此,请将正则表达式作为其自身规则中的唯一术语。
然后我创建了一个只有一个正则表达式规则的简单语法。正则表达式也是该规则中的唯一术语。
@@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”上失败。第一个在最开始,第二个在第一个换行符、空格或注释。
它只发生在正则表达式中,其他规则工作正常,例如如果名称定义为
Name = 'abc' | 'def' ;
然后一切正常,上述输入成功解析。
如何更改行为以使语法超越空格和注释?
附加信息:
上述输入的痕迹:
<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 选项指定空格(/\s+/ 和 /[ \t\n\r]+/ 但这并没有改变行为)
并使用以下命令启动解析器:
python parser.py eztest.txt Start -t