[英]Lex: How do I Prevent it from matching against substrings?
例如,我應該將“int”轉換為“INT”。 但如果有“整數”這個詞,我認為它不應該變成“INTeger”。
如果我定義"int" printf("INT");
但是,子串匹配。 有沒有辦法防止這種情況發生?
我相信以下內容可以捕獲您想要的內容。
%{
#include <stdio.h>
%}
ws [\t\n ]
%%
{ws}int{ws} { printf ("%cINT%c", *yytext, yytext[4]); }
. { printf ("%c", *yytext); }
要擴展超出單詞邊界(在本例中為{ws}
),您需要向ws
添加修飾符或添加更多特定的檢查。
好吧,這是我怎么做的:
(("int"([a-z]|[A-Z]|[0-9])+)|(([a-z]|[A-Z]|[0-9])+"int")) ECHO;
"int" printf("INT");
更好的建議歡迎。
Lex將選擇與當前輸入匹配最長的規則。 要避免子字符串匹配,您需要包含一個比int
更長的附加規則。 最簡單的方法是添加一個簡單的規則來獲取長於一個字符的任何字符串,即[a-zA-Z]+
。 整個lex程序看起來像這樣: -
%%
[\t ]+ /* skip whitespace */
int { printf("INT"); }
[a-zA-Z]+ /* catch-all to avoid substring matches */
%%
int main(int argc, char *argv[])
{
yylex();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.