4

Flex を使用してトークンを入力ストリームに戻す方法はありますか? のような機能を想像しますyyunlex()

4

2 に答える 2

3

REJECTトークンをストリームに戻し、最初に一致したルールが一致しなかったかのように他のルールと一致し続けるマクロがあります。char をストリームに戻したい場合は、@Kizaru の回答で十分です。

スニペットの例:

%%
a     |
ab    |
abc   |
abcd  ECHO; REJECT;
.|\n  printf("xx%c", *yytext);
%%
于 2012-06-04T21:28:51.523 に答える
2

いくつかのオプションがあります。

unput(ch)chが文字である場合、トークンの各文字を入力ストリームに戻すことができます。この呼び出しにより、chが入力ストリームの次の文字(スキャンで考慮される次の文字)になります。したがって、トークンの一致中に文字列を保存すると、これを行うことができます。

yyless(0)トークンからのすべての文字を入力ストリームに戻す方法を調べたい場合もあります。でもこれは使ったことがないので、落とし穴があるかどうかわかりません。n最初のn文字を除くすべてを入力ストリームに戻す整数を指定できます。

これをスキャン/解析中に頻繁に行う場合は、lexを使用してトークンを作成し、そのトークンを独自のデータ構造に配置して解析することをお勧めします。yyparse()これは、bisonとyaccの生成された関数が行うことと似ています。

于 2012-05-04T14:48:35.617 に答える