Posted on 2013-05-13 17:05
S.l.e!ep.¢% 閱讀(397)
評(píng)論(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擁有一套簡(jiǎn)單的消除歧義的規(guī)則,
1. lex只匹配輸入字符或字符串一次.
2. lex執(zhí)行當(dāng)前輸入最長(zhǎng)可能匹配的動(dòng)傷. 假設(shè)如果輸入 gohead , gohead?匹配到 [a-zA-Z]+ 和 go 這兩條規(guī)則, 但 [a-zA-Z]+ 是更長(zhǎng)的匹配動(dòng)作, 所以輸入 gohead 應(yīng)輸出? is not a verb?
如果把 [a-zA-Z]+? 去掉,
(1)輸入? gohead 那么 go 會(huì)匹配到,? head? 不作處理
輸出如下:
go: is a verb
head
(2)輸入 headgo
輸出如下:
headtogo
headtogo: is a verb
連 head 都輸出來(lái)認(rèn)為匹配了 go, 輸出了 is a verb.....