簡體   English   中英

為什么簡單的野牛語法規則不起作用?

[英]why simple grammar rule in bison not working?

我正在學習flex&bison,我被困在這里,無法弄清楚這樣一個簡單的語法規則如何不符合我的預期,下面是lexer代碼:

%{

#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;}
        ;

%%

任何人都可以告訴我,如果我嘗試輸入“從某事中選擇*”,為什么它會顯示錯誤?

[a-zA-Z].*將匹配字母字符,后跟除換行符之外的任意數量的任意字符。 換句話說,它將從字母字符匹配到行尾。

由於flex始終接受最長的匹配,因此select * from ...行將似乎只有一個令牌IDENTIFIER ,這是語法錯誤。

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

問題在這里。 它允許所有垃圾內容跟隨初始的字母字符並作為IDENTIFIER,返回IDENTIFIER,在這種情況下IDENTIFIER,包括在初始''之后的整個行的其余部分。

它應該是:

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

或可能

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

或您希望允許標識符后面跟隨字母首字母字符的任何其他內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM