私はAMPL言語のいくつかのサブセットのためのレクサーを構築しようとしています。 今、レクサーが扱っているシンボル型の名前が今必要です。 すべてのシンボル名は、varまたはparamまたはsetです。幸いなことに、それらのすべてを使用する前に宣言する必要があります。だから、私は単に私はyytextが第二が含まれていないため、仕事に行くのではないことを知っているこのどのように私はバッファからそれを削除せずにフレックスで次のトークンを覗くことができます
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;
}
}
%%
よう
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;
}
%%
からいくつかのことにレクサーのコードを変更するフレックスで前方参照演算子を使用することができます思いました最初の3つの正規表現の一部。 (。| \ n)+ {SYMBOLIC_NAME}の下にあるものをどうやって調べることができますか?
PS
私はコードが最適ではない知っているが、それはここでの問題ではありません:D
驚くばかりです。ソリューションをありがとう – Lisu