1

我正在尝试编写一个 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
4

1 回答 1

1

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

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

为什么不将驼峰式或 Python 式规则名称的选择留给用户呢?

  • 这是一个简单且易于实现的设计选择,允许在语言的词汇方面具有很大的灵活性
  • 预计 Python 程序员会对 Python 风格的名称感到满意
  • 计算机语法和解析器的传统是使用小写的规则名称
于 2016-11-28T11:07:26.460 回答