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; }

如果你的语言强制每一行只由一个标识符、一个空格和一个数字组成,这应该通过句法分析(即通过解析器)而不是词法分析来检查。

于 2013-01-29T17:43:52.960 回答