jflex语法中的空格分离

时间:2013-01-29 17:35:55

标签: java jflex

假设我需要简单的语法来描述像

这样的语言
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; }

但我不喜欢用于说明字和数字之间应该有空格的额外状态。我如何简化语法?

2 个答案:

答案 0 :(得分:3)

完全解析时,您不应该需要空格标记。

摆脱TokenType.WHITE_SPACE,当你在词法分析器中获得空格时,只需忽略它而不是返回任何东西。

要阻止'foo1',请为[A-Za-z0-9]添加另一个规则,为其添加另一个未出现在语法中的令牌类型;那就是语法错误。

答案 1 :(得分:1)

据我所知JFlex,如果你正在核心地识别空白(似乎就是这种情况),你就不必使用额外的状态。只需为“标识符”制定规则,为“数字”制定另一个规则。

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

如果你的语言强加的每一行只包含一个标识符,一个空格和一个数字,则应通过句法分析(即解析器)检查,而不是词法分析。