3

必要なすべての (そして唯一の) 情報を含めるように最善を尽くしました。もっと見ると助けになるかどうか教えてください。

正規表現に問題があります。私のプログラムは、lexeme - トークンのペアを .txt ファイルに出力します。識別子と整数を除いて、すべてが正常に機能しています。たとえば、識別子のトークンは 262 です。

サンプル入力ファイル:

function main a: integer returns integer;
    b: integer is a * 2;

出力例:

function - 269
maina - 262
integer - 272
returns - 274
integer - 272
; - 59
b - 262
integer - 272
is - 271
a - 262
2 - 263
; - 59

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

function - 269
main - 262
a - 262
: - 58
integer - 272
returns - 274
integer - 272
; - 59
b - 262
: - 58
integer - 272
is - 271
a - 262
* - 261
2 - 263
; - 59

要約すると、空白で区切られた 2 つの識別子を結合し、識別子の後のトークンも削除します。

4

1 に答える 1

1

一部の名前を中括弧で囲むのを忘れただけです。それ以外の

{letter}(letter|digit)*

あなたは書くべきです

{letter}({letter}|{digit})*

識別子のルールもそれらに一致するため、 functioninteger、およびreturnのルールを識別子のルールの前に移動する必要もあります。

于 2013-01-23T22:17:55.160 に答える