Posted on 2013-05-13 17:05
S.l.e!ep.¢% 閱讀(391)
評論(0) 編輯 收藏 引用 所屬分類:
yacc
拿的還是一本書的例子, 為了更方便研究,還把它改了下
%option?main?
%{
#include?<stdlib.h>
#include?<string.h>
%}
%%
[\t?]+????????/*?ignore?white?space?*/?;
go????????{?printf("%s:?is?a?verb\n",?yytext);?}
[a-zA-Z]+?????{?printf("%s:?is?not?a?verb\n",?yytext);?}
.|\n????????{?ECHO;?/*?normal?default?anyway?*/?}
%%
lex擁有一套簡單的消除歧義的規則,
1. lex只匹配輸入字符或字符串一次.
2. lex執行當前輸入最長可能匹配的動傷. 假設如果輸入 gohead , gohead?匹配到 [a-zA-Z]+ 和 go 這兩條規則, 但 [a-zA-Z]+ 是更長的匹配動作, 所以輸入 gohead 應輸出? is not a verb?
如果把 [a-zA-Z]+? 去掉,
(1)輸入? gohead 那么 go 會匹配到,? head? 不作處理
輸出如下:
go: is a verb
head
(2)輸入 headgo
輸出如下:
headtogo
headtogo: is a verb
連 head 都輸出來認為匹配了 go, 輸出了 is a verb.....