假设我需要简单的语法来描述语言
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; }
但是我不喜欢用于说单词和数字之间应该有空格的额外状态。如何简化我的语法?
最佳答案
根据我对 JFlex 的了解,如果您正确识别空格(似乎是这种情况),则不必使用额外的状态。只需为“标识符”制定一个规则,并为“数字”制定另一个规则。
%%
{WORD} { return TokenType.WORD; }
{NUMBER} { return TokenType.NUMBER; }
如果您的语言强制每一行只由一个标识符、一个空格和一个数字组成,则应通过句法分析(即通过解析器)而不是词法分析来检查。
关于java - jflex语法中的空格分离,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14588821/