3

次のような言語を説明する簡単な文法が必要だとします。

foo 2
bar 21

だがしかし

foo1

jflexを使用して私はsmtのように書いた

WORD=[a-zA-Z]+
NUMBER=[0-9]+
WHITE_SPACE_CHAR=[\ \n\r\t\f]

%state AFTER_WORD
%state AFTER_WORD_SEPARATOR

%%
<YYINITIAL>{WORD}               { yybegin(AFTER_WORD); return TokenType.WORD; }        
<AFTER_WORD>{WHITE_SPACE_CHAR}+ { yybegin(AFTER_WORD_SEPARATOR); return TokenType.WHITE_SPACE; }        
<AFTER_WORD_SEPARATOR>{NUMBER}  { yybegin(YYINITIAL); return TokenType.NUMBER; }        

{WHITE_SPACE_CHAR}+             { return TokenType.WHITE_SPACE; }

しかし、単語と数字の間に空白があるべきだと言っていた余分な州は好きではありません。文法を単純化するにはどうすればよいですか?

4

2 に答える 2

4

解析するときに空白トークンは必要ありません。

を取り除きTokenType.WHITE_SPACE、レクサーに空白ができたら、何も返さずに無視します。

を防ぐには、文法に表示されない'foo1'別のルールとそのトークンタイプを追加します。[A-Za-z0-9]次に、構文エラーです。

于 2013-01-30T00:36:15.390 に答える
1

私がJFlexについて知っていることから、空白を正確に認識している場合(これは事実のようです)、余分な状態を使用する必要はありません。「識別子」のルールと「数値」のルールを作成するだけです。

%%
{WORD}    { return TokenType.WORD; }
{NUMBER}  { return TokenType.NUMBER; }

あなたの言語が各行を正確に1つの識別子、1つのスペース、1つの数字で構成するように強制している場合、これは字句解析ではなく構文解析(つまり、パーサー)によってチェックする必要があります。

于 2013-01-29T17:43:52.960 に答える