![](/img/trans.png)
[英]ANTLR 4 - Grammar Rule for string to support whitespace and special char
[英]Whitespace separation in jflex grammar
假设我需要简单的语法来描述类似
foo 2
bar 21
但不是
foo1
使用jflex我写了像
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]
添加另一个规则,并为其添加一个不在语法中显示的令牌类型; 那就是语法错误。
根据我对JFlex的了解,如果您能完全识别空格(似乎是这种情况),则不必使用额外的状态。 只需为“标识符”制定一条规则,为“数字”制定另一条规则。
%%
{WORD} { return TokenType.WORD; }
{NUMBER} { return TokenType.NUMBER; }
如果您的语言要求每一行都由一个标识符,一个空格和一个数字组成,则应通过句法分析(即解析器)而不是词法分析来检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.