私はlex(flex)でコンテキスト/モードまたは "スタックのスタック"をエミュレートする方法を見つけようとしています。Lexモードやコンテキストのスタックをエミュレートする方法
特に、式yのコンテキストに戻すことができる文字列リテラルの概念を持つパーサーを作成したいと思います。
私は構文'...'
を使用して生の文字列リテラルをサポートする簡単な文法を持っており、見つかったら文字列を出力します。
しかし、文字列トークンは、無制限の長さを持ちます(生成されたCソースでマクロで定義されているlexの最大バッファサイズまで)。
begin_string
トークン'
とend_string
トークン'
と、文字列内で文字を読み取るための別個のトークンを定義します。
これを実現するには、「現在は文字列になっています」というコンテキストの概念を持ち、どのトークン化ルールが「アクティブ」であるかに影響を与えます。
ここでは、文脈のためのナイーブな文法があります。
%{
#include <stdio.h>
%}
%option noyywrap
%%
'[^']*' { printf("found string literal ((%s))\n", yytext); }
\n { /* do nothing */ }
. { /* do nothing */ }
%%
int main()
{
yylex();
return 0;
}
[開始条件](http://westes.github.io/flex/manual/Start-Conditions.html)を見ましたか?私があなたの質問を理解していれば、それはあなたが探しているものです(あなたのニーズを完全に理解していない可能性もありますが)。 flexを使用している場合、トークンには恣意的な制限はありません。 mallocがより多くのスペースを提供することを拒否するまで、バッファは展開されます。 – rici