首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >涉及正则表达式时grako中的空格处理

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

Stack Overflow用户
提问于 2016-11-27 13:18:57
回答 1查看 101关注 0票数 1

我在试着写一个带有格拉科味道的ebnf语法。我注意到,在尝试解析正则表达式时,生成的解析器似乎没有超越空白空间或注释。

文档说明了关于这个主题的如下内容

与其他表达式不同,此表达式不超过空白或注释。为此,将regexp作为它自己的规则中的唯一术语。

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

代码语言:javascript
复制
@@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“上失败。第一个在最开始,第二个在第一个换行符,空格或注释。

它只发生在正则表达式中,其他规则可以很好地工作,例如,如果名称被定义为

代码语言:javascript
复制
Name      = 'abc' | 'def' ;

然后一切正常,上面的输入成功地解析。

如何改变行为,使语法优于空白空间和注释?

附加信息:

上述投入的痕迹:

代码语言:javascript
复制
<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

代码语言:javascript
复制
<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

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

代码语言:javascript
复制
grako --generate-parser --outfile parser.py test.ebnf

我还尝试使用-w选项(/\s+/和/ \t\n\r+/ )指定空白空间,但这并没有改变行为。

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

代码语言:javascript
复制
python parser.py eztest.txt Start -t
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-28 11:07:26

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

更改语法中的规则名,以便它们以小写字母开头,这应该很好。

为什么不让用户来选择camel case还是Python风格的规则名称呢?

  • 这是一个简单且易于实现的设计选择,允许在语言的词法方面具有很大的灵活性。
  • 预期Python程序员会对Python风格的名称感到满意。
  • 计算机化语法和解析器的传统是使用小写作为规则名。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40829423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档