[英]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.