假设我需要简单的语法来描述像
这样的语言foo 2
bar 21
但不是
foo1
使用jflex我写了类似
的smtWORD=[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; }
但我不喜欢用于说明字和数字之间应该有空格的额外状态。我如何简化语法?
答案 0 :(得分:3)
完全解析时,您不应该需要空格标记。
摆脱TokenType.WHITE_SPACE
,当你在词法分析器中获得空格时,只需忽略它而不是返回任何东西。
要阻止'foo1'
,请为[A-Za-z0-9]
添加另一个规则,为其添加另一个未出现在语法中的令牌类型;那就是语法错误。
答案 1 :(得分:1)
据我所知JFlex,如果你正在核心地识别空白(似乎就是这种情况),你就不必使用额外的状态。只需为“标识符”制定规则,为“数字”制定另一个规则。
%%
{WORD} { return TokenType.WORD; }
{NUMBER} { return TokenType.NUMBER; }
如果你的语言强加的每一行只包含一个标识符,一个空格和一个数字,则应通过句法分析(即解析器)检查,而不是词法分析。