我想匹配這兩個標記:
1. NUM:一系列字符,[0-9_]中間有一個可選字符.。
2. :至少有一個字符ID的一系列字符。[a-zA-Z0-9_][a-zA-Z]
這些的彈性規則將是:
[0-9_] ([.][0-9_] )?/[^a-zA-Z0-9_] return NUM;
[a-zA-Z0-9_]*[a-zA-Z][a-zA-Z0-9_]* return ID;
.
.
.
請注意,NUM因為"123.456ab"應該匹配123- NUM,.-OPER和456ab-需要尾隨背景關系ID。如果沒有尾隨背景關系,它將匹配123.456- NUM& ab- ID。
NUM但是現在的問題是,后面跟EOF就不會匹配了。那么,如何在 flex 規則的尾隨背景關系中匹配 EOF?
TL; DR:
我想要NUM的:后面沒有[a-zA-Z0-9_].
我目前得到的是:NUM后跟一個字符,而不是[a-zA-Z0-9_].
這兩個在 EOF 上有所不同。
編輯:剛剛知道Re/Flex支持單詞邊界。如果我從 using 轉移Flex到Re/Flex,是否有任何性能下降?或任何其他我應該注意的事情?
uj5u.com熱心網友回復:
您不能將 EOF 放在尾隨背景關系中這一事實有時很煩人,但幾乎總是有一種解決方法,通常基于使用最大 munch 匹配排序來確保 EOF 處的某些模式匹配,因為任何其他匹配都會更長。(請記住,即使它不是最終標記的一部分,尾隨背景關系也可用于長度比較)。
這是一個例子:
[0-9_] /[.][0-9_]*[a-zA-Z] return NUM;
[0-9_] ([.][0-9_] )? return NUM;
[0-9_]*[a-zA-Z][a-zA-Z0-9_]* return ID;
如果小數點后面跟著可能是 ID 的東西,則模式一匹配數字后跟小數點。
模式二匹配任何數字,不管后面是什么(如果有的話)。
模式三匹配一個 ID(至少一個字母)。(它與您的第二個模式具有相同的效果。我只是縮短了第一個字符類;因為*無論如何都使前綴可選,所以帶有前導字母的 ID 可以直接與模式的其余部分匹配。)
我們依靠最大咀嚼來避免模式二過早匹配。沒有小數點后跟一個字母的數字將在模式三中匹配更長的時間;帶有小數點后跟字母的數字將與模式三匹配更長的時間。剩下的就是不跟字母的數字;對于那些模式,兩個將適用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/475177.html
