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

时间:2016-11-27 13:18:58

标签: regex parsing grammar ebnf grako

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

文档说明了该主题的以下内容

  

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

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

function save_image($image , $name){
    $servername = "localhost";
    $username = "cl60-shooters";
    $password = "dbsjcNs-b";
    $database='xxxxxxxx';/* enter correct db name */


    $conn = new mysqli( $servername, $username, $password, $database );
    $qry = "insert into images (`photo`, `name`) VALUES ('$image','$name')";
    $result = mysqli_query($conn,$qry);

    if($result){
        echo "Successfull upload";
    }else{
        echo "try Again";
        print_r($result);
    }
}

生成的解析器在输入“abc \ ndef”和“abc \ ndef”上失败。第一个是第一个新行,空格或评论的第一个。

只有正则表达式才会出现,其他规则工作正常,例如如果name定义为

@@eol_comments :: ?/(#[^\r\n]*)|(\/\/[^\r\n]*)/?
@@comments :: ?/\s*\/\*(.|[\r\n])*?\*\//?

Start     = NameList $;
NameList  = { Name } ;
Name      = /[a-zA-Z_][a-zA-Z0-9_]+/ ;

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

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

其他信息:

以上输入的痕迹:

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

我也尝试使用-w选项指定空格(/ \ s + /和/ [\ t \ n \ r] + /但不改变行为)

使用以下命令启动解析器:

grako --generate-parser --outfile parser.py test.ebnf

1 个答案:

答案 0 :(得分:1)

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

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

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

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