0

これは、入力として次のように入力したときの字句解析コードです。

/*This is an example */

program
        var a,b:integer;

begin

        a =2;

        b =a+5;

        write(a);

        if b==1 then write(a);

end

出力は次のようになります。

<res,program>
<res,var> <id,a>,<id,b>:<res,integer>;
<res,begin>
<id,a> <assign,=><num,2>;
<id,b> <assign,=><id,a><addop,+><num,5>;
<res,write>(<id,a>);
<res,if> <id,b><relop,==><num,1> <res,then> <res,write>(<id,a>);
<res,end>

しかし、私の出力は次のとおりです。

Lexical Error~/hedor1>exampler < input\ .txt 
<res,program><res,var><id,a>,<id,b>:<res,integer>;<res,begin><id,a><assign,=><num,2>;<id,b><assign,=><id,a><addop,+><num,5>;<res,write>(<id,a>);<res,if><id,b><relop,==><num,1><res,then><res,write>(<id,a>);<res,end>

パターンセクションで定義したのに、改行を回避して出力に出力しない理由がわかりません\n printf("\n"); 。問題は何ですか?

4

1 に答える 1

0

入力のどこにも、単一の改行がありません。1 つまたは複数の空白文字 (スペース、タブ、および改行) のシーケンスだけです。それに一致するルールがあるため、Flex は最長の一致を使用します。

Flex は貪欲なパーサーを生成し、可能な限り多くの入力を照合しようとします。たとえば、入力された realityを見た場合、 real の一致後に停止せず、別のトークンとしてityの一致を続行します。代わりに、すべての現実に一致します。

同様に、開始コメントの後の入力では、1 つではなく2 つの改行があり (そこに空の行があるため)、これは\nルールによって 2 回行われるのではなく、 {whitespace}+ルールによって一致します。 .

于 2012-11-10T17:58:00.817 に答える