【发布时间】:2014-06-29 08:15:02
【问题描述】:
ANTLR 词法分析器规则设计
我需要以下令牌:
- 允许的字符包括大写、小写、数字、空格和连字符
- 不定长度(长度必须至少为两个字符)
- 标记必须至少包含一个空格或连字符
- 标记必须以大写、小写、数字、空格或连字符开头和结尾(不能以空格开头或结尾)
下面语法中的 ANTLR 词法分析器规则“AlphaNumericSpaceHyphen”几乎可以工作,除了一种情况。使用解析器规则“sic”进行测试,将解析以下输入(不带引号):
“标准工业分类:水运[4400]”
以下输入无法解析(不带引号):
“标准工业分类:水运 [4400]”
问题在于词法分析器规则“AlphaNumericSpaceHyphen”在词法分析器意识到没有匹配项之前消耗了“WATER TRANSPORTATION”之后的空格和左方括号,因为它走得太远了。
我尝试过各种类型的谓词,但没有任何运气。非常感谢任何帮助。
grammar T;
sic: SICSpecifier AlphaNumericSpaceHyphen LEFTBRACKET Digits RIGHTBRACKET;
LEFTBRACKET
: '[';
RIGHTBRACKET
: ']';
SICSpecifier: 'STANDARD INDUSTRIAL CLASSIFICATION:';
WS : (' '|'\t')+
{
$channel = HIDDEN;
};
fragment UCASEALPHA : 'A'..'Z';
fragment LCASEALPHA : 'a'..'z';
fragment DIGIT : '0'..'9';
Digits: DIGIT+;
AlphaNumericSpaceHyphen
: (UCASEALPHA|LCASEALPHA |DIGIT|'-')+ (' ' (UCASEALPHA|LCASEALPHA |DIGIT|'-')+)+
| (UCASEALPHA|LCASEALPHA |DIGIT)+ ('-')+ ((' '|UCASEALPHA|LCASEALPHA |DIGIT|'-')* (UCASEALPHA|LCASEALPHA |DIGIT|'-'))?
| ('-')+ (UCASEALPHA|LCASEALPHA |DIGIT)+ ((UCASEALPHA|LCASEALPHA |DIGIT|'-'|' ')* (UCASEALPHA|LCASEALPHA |DIGIT|'-'))?
;
【问题讨论】: