2016-11-27 88 views
1

我正在尝试编写grako风格的ebnf语法。我发现生成的解析器在尝试解析正则表达式时似乎没有超过空格或注释。当涉及正则表达式时,在grako中处理空格

文档说关于该主题

不像其他的表情下面,这一个不超过空白或意见前进。为此,将正则表达式作为自己规则中的唯一术语。

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

@@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' ; 

定义,那么一切都OK和上面的投入成功的解析。

如何更改行为,使语法在空格和注释上前进?

附加信息:上述输入

痕迹:

<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 

回答

0

规则名称在特殊Grako。正如文档解释的那样,在开始解析之前,它们不会超越空白。

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

为什么不把选择骆驼或Python风格的规则名称留给用户?

  • 这是一个简单和易于实现的设计选择,允许很大的灵活性,在语言词汇方面
  • 据预计,Python程序员将熟悉Python风格的名字
  • 计算机化语法和解析器的传统是使用小写规则名称
+0

啊谢谢我忽略了这一点。在我学习正式语法的过程中,我们曾经使用AST的大型语法规则和小写名称来表示属性。所以感觉自然喔写规则“就像:这个” –