2017-08-18 9 views
0

私はフレックス/バイソンのレクサー/パーサーで扱いにくい問題を扱っています。ここで Flex/Bison:あいまいなトークンをレキシングする

はローマ数字と任意の識別子のために、いくつかのフレックスルールです:今

"I"|"II"|"III"|"IV"|"V"|"VI"|"VII"|"i"|"ii"|"iii"|"iv"|"v"|"vi"|"vii" { return NUMERAL; } 

"foobar" { return FOOBAR; } 

[A-Za-z0-9_]+ { return IDENTIFIER; } 

、この単純な文法を検討:

IVfoobar 
:最後に

%token <numeral> NUMERAL 
%token <foobar> FOOBAR 
%token <identifier> IDENTIFIER 

program 
    : numeral foobar { } 
    ; 

を、ここでは例として入力されます

私はこれを数字IVとしてレックスするつもりで、フーバーが続きます。しかし、これを識別子 "Vfoobar"の後に付いた数字、または識別子 "IVfoobar"だけでなく、どちらも無効であるとしてレキシングするのを防ぐにはどうすればいいですか?

+1

なぜ 'IVfoobar'は無効な識別子ですか?あるいは、別の言い方をすれば、正確に有効な識別子は何ですか? – rici

+0

@riciそれには解析ルールはないため、解析エラーが発生します。 – dylhunn

+1

さて、はい。しかし、レクサーはそれを知ることができません。それは、それが間違って使用される有効な識別子になります。 – rici

答えて

0

本当にこれをレクサーレベルで処理したい場合は、IDENTIFIERのルールがローマ数字(I、II、... vii ...)で始まる文字列と一致しないようにする必要があります。

これは、Lexが最長入力に一致するルールを選択するためです。

IDENTIFIERの最初の文字からローマ数字を除いた文字は、有効な識別子のセットを作るでしょうか?

{?i:[a-z0-9_]{-}[ivxlcdm]}{?i:[a-z0-9_]}* { return IDENTIFIER; } 
関連する問題