bison + flex でブロック区切り文字としてインデントを実装する方法を知りました。ちょうどパイソンのように。私は独自のプログラミング言語を書いています (主に楽しみのためですが、ゲーム エンジンと一緒に使用するつもりです)。
私はすでに C でコンパイラ (実際には「langToy」から Nasm へのトランスレータ) を作成しましたが、失敗しました。なんらかの理由で、ソース ファイル全体で 1 つの文字列しか処理できませんでした (まあ、私は 48 時間以上起きていたので... ご存知のように、脳のメルトダウンです)。
中括弧および/または begin -> end の実装が簡単なのか (それを行うのに問題はありません)、それともロックアップするのは私の脳だけなのかはわかりません。
前もって感謝します!
更新:わかりました、フレックスでそれを行う方法についての手がかりがありません。複数の DEDENT をパーサーに返すのに問題があります。Flex/Bison は私にとって比較的新しいものです。
更新 2: これは、これまでに思いついたフレックス ファイルです。よくわかりません:
%x t
%option noyywrap
%{
int lineno = 0, ntab = 0, ltab = 0, dedent = 0;
%}
%%
<*>\n { ntab = 0; BEGIN(t); }
<t>\t { ++ntab; }
<t>. { int i; /* my compiler complains not c99 if i use for( int i=0... */
if( ntab > ltab )
printf("> indent >\n");
else if( ntab < ltab )
for( i = 0; i < ltab - ntab; i++ )
printf("< dedent <\n");
else
printf("= =\n");
ltab = ntab; ntab = 0;
BEGIN(INITIAL);
/* move to next rule */
REJECT;}
. /* ignore everything else for now */
%%
main()
{
yyin = fopen( "test", "r" );
yylex();
}
あなたはそれをいじってみることができます、多分あなたは私が欠けているものを見るでしょう. 複数の dedent を返すことは、Haxe では簡単です ( return t_dedent( num ); )。
このコードは、インデント/デデントと常に正しく一致するとは限りません。
更新 3: flex への希望をあきらめて、自分のやり方でやろうと思います。誰かが flex でそれを行う方法を知っていれば、とにかくそれを聞いてうれしいです.