假设我需要描述语言的简单语法
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; }
但我不喜欢用于表示单词和数字之间应该有空格的额外状态。如何简化我的语法?
最佳答案
解析时根本不需要空格标记。
摆脱 TokenType.WHITE_SPACE
,当您在词法分析器中遇到空白时,忽略它而不是返回任何内容。
为防止 'foo1'
,为 [A-Za-z0-9]
添加另一个规则,并为其添加另一个未出现在语法中的标记类型;那么这是一个语法错误。
关于java - jflex 语法中的空格分隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14588821/