我正在嘗試爲AMPL語言的一些子集構建詞法分析器。 我需要現在什麼類型的符號名稱詞法分析器正在處理。 每個符號名稱都是var或param或set。幸運的是,它們都必須在使用之前進行申報。所以我想我可以在詞法分析器使用先行運營商在柔性簡單地改變代碼如何在flex中查看下一個令牌而不將其從緩衝區中移除
SYMBOLIC_NAME [a-zA-Z_][a-zA-Z0-9_]*
%%
param { return PARAM; }
var { return VAR; }
set { return SET; }
{SYMBOLIC_NAME} { yylval.string = (char*) strdup(yytext);
return SYMBOLIC_NAME;
}
%%
一些這樣的事
SYMBOLIC_NAME [a-zA-Z_][a-zA-Z0-9_]*
%{
#include <vector>
#include <algorithm>
std::vector<std::string> paramNames;
std::vector<std::string> setNames;
std::vector<std::string> varNames;
%}
%%
param/(.|\n)+{SYMBOLIC_NAME} { paramNames.push_back(&yytext[5]);
return PARAM; }
var/(.|\n)+{SYMBOLIC_NAME} { varNames.push_back(&yytext[3]);
return VAR; }
set/(.|\n)+{SYMBOLIC_NAME} { setNames.push_back(&yytext[3]);
return SET; }
{SYMBOLIC_NAME} { if (std::find(setNames.begin(), setNames.end(), yytext) != setNames.end()) {
yylval.string = (char*) strdup(yytext);
return SET_NAME;
}
if (std::find(paramNames.begin(), paramNames.end(), yytext) != paramNames.end()){
yylval.string = (char*) strdup(yytext);
return PARAM_NAME;
}
if (std::find(varNames.begin(), varNames.end(), yytext) != varNames.end()){
yylval.string = (char*) strdup(yytext);
return VAR_NAME;
}
}
%%
我知道這是行不通的,因爲yytext中不包含第二前三個正則表達式的一部分。 問題出現在(。| \ n)+ {SYMBOLIC_NAME}之下。
PS
我知道代碼是不是最佳的,但它是不是在這裏的一個問題:d
太棒了。感謝您的解決方案 – Lisu