1

私は、セミコロンを挿入したjavascriptに似た言語のパーサーを書いています。

var x = 1 + 2;
x;

var x = 1 + 2

x

そしてさえ

var x = 1 +
2
x

同じだ。

今のところ、レクサーは改行 ( \n ) と一致するのは、セミコロンとは異なるトークンの後に出現する場合のみです。1 と 2 のような基本的な状況ではうまく機能しますが、3 番目の状況にどのように対処できますか? つまり、表現の途中で改行が発生します。パーサーを汚染するため(どこにでも改行トークンを使用して代替を挿入する)、毎回改行を一致させることはできません。また、ステートメントターミネータであるため、まったく一致させることもできません。基本的に、ステートメントの末尾の解析中に改行文字またはセミコロンがあるかどうかを何らかの方法で確認するのが最善です。

4

1 に答える 1

0

これはしばらく答えられませんでした。ステートメント区切り文字を改行 ** または * セミコロンにできない理由がわかりません。このようなビット:

whitespace    [ \t]+
%%
{whitespace}    /* Skip */
;[\n]*        return(SEMICOLON);
[\n]+         return(SEMICOLON);

そうすれば、文法でセミコロンしか得られないので、文法はまったく混乱していません。

于 2015-01-23T15:20:50.117 に答える