-2

私はフレックスでスキャナーを書いています、そして私は次の2つの定義を持っています:

%%
"int" printf("JUST_INT");
"int"[ \t\n]+"matrix" printf("MATRIX_INT");
[A-Za-z][A-Za-z0-9]*  printf("IDENTIFIER");
%%

スキャナーへの入力がの場合int matrixM = 3;、出力はMATRIX_INT IDENTIFIERです。入力は。と見なされint matrix M=3ます。しかし実際には、これはではなく、matrix識別子の名前はですmatrixM。出力はである必要がありますJUST_INT IDENTIFIER。なぜこうなった?それは私の定義によるものですか?

4

2 に答える 2

2

のようなスペースをスキャンするルールを用意するのは良い考えではありません"int"[ \t\n]+"matrix"。「int」、「matrix」、およびIDENTIFIERを3つの別個のトークンとして返し、パーサーに分類させます。それはそれよりもはるかに優れていflexます。flex最初の最長の一致を実行します。

于 2013-03-14T01:19:52.403 に答える
1

本当にスキャナーレベルでこれを解決したい場合は、

"int"[ \t\n]+"matrix"/($|[ \t\n]|;|whateverelsedelimitsanidentifier)

これによりmatrix、その後に「非単語」が続く場合にのみ一致するようになります。EJPが言ったように、それは良い考えではありません、そしてあなたは代わりにおそらくパーサーレベルでこれをするべきです。

于 2013-03-14T10:35:03.870 に答える