【问题标题】:Whitespace handling in grako when regular expressions are involved涉及正则表达式时 grako 中的空白处理
【发布时间】:2017-04-11 07:07:45
【问题描述】:

我正在尝试编写一个 grako 风格的 ebnf 语法。我注意到,在尝试解析正则表达式时,生成的解析器似乎没有超过空格或 cmets。

文档中关于该主题的内容如下

与其他表达式不同,这个表达式不会超过空格或 cmets。为此,请将正则表达式作为其自身规则中的唯一术语。

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

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

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

我怎样才能改变行为,使语法在空格和 cmets 上前进?

其他信息:

上述输入的痕迹:

<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

【问题讨论】:

    标签: regex parsing grammar ebnf grako


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 啊,谢谢,我忽略了这一点。在我学习形式语法的课程中,我们曾经使用大写名称来表示语法规则,而小写名称则用于 AST 中的属性。所以写规则“like:This”感觉很自然
    猜你喜欢
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多