Java jflex语法中的空格分隔

Java jflex语法中的空格分隔,java,jflex,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

假设我需要描述语言的简单语法,比如

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; }
WORD=[a-zA-Z]+
数字=[0-9]+
空白字符=[\\n\r\t\f]
%字后述
%单词分隔符后的状态
%%
{WORD}{yybeagin(在单词之后);返回TokenType.WORD;}
{WHITE_SPACE_CHAR}+{yybeagin(在单词分隔符之后);返回TokenType.WHITE_SPACE;}
{NUMBER}{yybeagin(YYINITIAL);返回TokenType.NUMBER;}
{WHITE_SPACE_CHAR}+{return TokenType.WHITE_SPACE;}

但我不喜欢额外的状态,用来表示单词和数字之间应该有空格。如何简化语法?

根据我对JFlex的了解,如果您能够正确识别空格(似乎是这样),就不必使用额外的状态。只需为“标识符”和“数字”制定一条规则


如果您的语言强制要求每行仅由一个标识符、一个空格和一个数字组成,则应通过语法分析(即语法分析器)进行检查,而不是通过词法分析进行检查。

在进行语法分析时,不应使用空格标记

去掉
TokenType.WHITE_SPACE
,当你在lexer中得到空白时,忽略它而不是返回任何东西


为防止
'foo1'
,为
[A-Za-z0-9]
添加另一条规则,并为其添加语法中未出现的另一个标记类型;那就是语法错误。

似乎是真的。但我真的需要这些空白。因为我也为IDE开发了插件,所有元素都是有价值的。你针对的是哪个IDE?那么你不应该像@EJP建议的那样去掉TokenType.WHITE_SPACE,因为在你的
ParserDefinition
中需要它。我在回答中建议的JFlex代码片段应该可以工作。然后在解析器中编写逻辑,检查标识符后面是否有数字。如果你还没有完成,我建议你看看这个非常好的教程:在那里你将学习如何使用语法工具包编写解析器,这是一个非常有用的工具:)@Nebelmann Ok。谢谢我当然看过那个教程。但由于我还需要从Idea解析器中分离出来,所以我决定将lexer更强大地结合起来。这是一个错误。我认为主要的困难是,我不能清楚地将语法的词法分析器和语法分析器分开。
%%
{WORD}    { return TokenType.WORD; }
{NUMBER}  { return TokenType.NUMBER; }