【问题标题】:why simple grammar rule in bison not working?为什么野牛中的简单语法规则不起作用?
【发布时间】:2013-08-09 09:39:42
【问题描述】:

我正在学习 flex 和 bison,我被困在这里,无法弄清楚这样一个简单的语法规则如何无法按我的预期工作,下面是词法分析器代码:

%{

#include <stdio.h>
#include "zparser.tab.h"

%}

%%

[\t\n ]+        //ignore white space

FROM|from           { return FROM;   }
select|SELECT       { return SELECT; }
update|UPDATE       { return UPDATE; }
insert|INSERT       { return INSERT; }
delete|DELETE       { return DELETE; }
[a-zA-Z].*          { return IDENTIFIER; }
\*                  { return STAR;   }

%%

下面是解析器代码:

%{
#include<stdio.h>
#include<iostream>
#include<vector>
#include<string>
using namespace std;

extern int yyerror(const char* str);
extern int yylex();


%}

%%

%token SELECT UPDATE INSERT DELETE STAR IDENTIFIER FROM;


ZQL     : SELECT STAR FROM  IDENTIFIER { cout<<"Done"<<endl; return 0;}
        ;

%%

谁能告诉我为什么如果我尝试输入“select * from something”会显示错误

【问题讨论】:

  • 小心标记。 Flex 标签用于 Adob​​e/Apache UI 框架。 Flex-lexer 标签用于词法分析器。
  • 在什么标记处显示什么错误?

标签: c++ parsing bison flex-lexer


【解决方案1】:

[a-zA-Z].* 将匹配一个字母字符,后跟任意数量的任意字符,换行符除外。换句话说,它会从一个字母字符匹配到行尾。

由于 flex 总是接受最长的匹配,所以select * from ... 行似乎只有一个标记,IDENTIFIER,这是一个语法错误。

【讨论】:

  • 我知道了,但我还是想问一下,它是唯一的匹配条件,我是说最长的匹配规则吗?实际上,我想要做的是编写一个模式,该模式将匹配任何以字母开头的标识符,但不匹配我已经为上面编写的规则的关键字之一。
  • @smit:你需要更精确。标识符不能由任何字符组成;通常,它必须是一个字母,后跟一系列字母或数字,可能还有一些其他有效字符(如_$)。例如,[a-zA-Z][a-zA-Z0-9]*(只是字母和数字)。为了避免与关键字冲突,你需要把关键字放在第一位,因为 flex 从最长的匹配中选择第一个匹配(即首先找到最长的匹配,然后选择第一个匹配的模式。)
  • 我实际上并没有尝试过,但是您放在这里的内容,即 [a-zA-Z][a-zA-Z0-9]* 与 SELECT 或 UPDATE 之类的关键字不匹配我的意思是他们也以字母开头,后跟一些字符或数字......这让我感到困惑。
  • @smit:是的,它会匹配。在这种情况下,将有两个匹配的规则,flex 将选择 first 一个。正如我所说,flex 首先确定哪些规则具有最长的可能匹配,然后如果有多个规则,则选择第一个这样的规则。所以你需要把关键字规则放在你的文件中,就像你做的那样。
【解决方案2】:

[a-zA-Z].* { return IDENTIFIER; }

问题就在这里。它允许任何垃圾跟随一个初始字母字符并返回为IDENTIFIER,,在这种情况下,包括初始 ''s 之后的整个其余行。

应该是:

[a-zA-Z]+          { return IDENTIFIER; }

或者可能

[a-zA-Z][a-zA-Z0-9]*          { return IDENTIFIER; }

或您希望允许在标识符中跟随初始字母字符的任何其他内容。

【讨论】:

  • 你能帮我写一个规则来匹配任何不属于其中一个关键词的标识符吗(我以后可能想添加更多关键词)
  • @smit 我刚刚在我的回答中完全做到了。多么荒谬的要求。
最近更新 更多