0

C に似た言語用の語彙および構文アナライザーを作成する必要があります。この言語では、「記号 // から行末までのすべて」をコメントとして定義します。コンパイラが「/」に到達するたびに、それでも構文エラーが発生します

%%

[ \t]                   { } 
[0-9]+                  { SAVE_TOKEN; return TINTEGER; }

"main_loop"             { return TOKEN(TMAIN); }
"{"                     { return TOKEN(TLBRACE); }
"}"                     { return TOKEN(TRBRACE); }
";"                     { return TOKEN(TSEMI); }
"("                     { return TOKEN(TLPAREN); }
")"                     { return TOKEN(TRPAREN); }

"rotate"                { return TOKEN(TROTATE); }
"forward"               { return TOKEN(TFORWARD); }

%{
/* Do not add any of your own tokens below this line!!!! */
%}

"\n"                     { g_LineNumber++; }

これは、構文エラーが発生している部分です。

"//.*"                      {g_LineNumber++; }


[a-zA-Z_]+          { std::cout << "ERROR: Unknown token '" << yytext << "' on line " << g_LineNumber << std::endl; yyterminate(); }

.                   { std::cout << "ERROR: Unknown token '" << yytext << "' on line " << g_LineNumber << std::endl; yyterminate(); }

%%
4

1 に答える 1

0

コメントのパターンは、おそらく次のようになります。

"//".*"\n"  {g_LineNumber++;}

パターンは.*、二重引用符内にあるため、入力で文字通り発生することが期待されます。行番号を増やすことを考えると、おそらくコメントの一部として改行を一致させたいと思うでしょう。

于 2013-05-10T11:48:15.013 に答える