antlr匹配解析器规则而不是令牌

时间:2013-07-08 09:32:13

标签: antlr

我正在尝试匹配以下序列:

var1.x , "cssStyleName : styleValue";

cssStyleName和styleValue是...... well ... css兼容样式,例如color: #000 !important; *width: 99.94680851063829%;"等。

inputSpecs: modelVariable (COMMA  cssStyle )*;

modelVariable: TEXT ('.' childVar)*;

childVar : TEXT; 

cssStyle:  styleName COLON styleValue+ SEMICOLON;

styleName : ASTERISK? TEXT ;

styleValue :  TEXT | STYLE_VALUE;



COLON: ':';
SEMICOLON: ';';
ASTERISK: '*';
COMMA: ',';
TEXT : ('a'..'z'|'A'..'Z'| '_' | '-' | '0'..'9')+ ;
STYLE_VALUE: ('a'..'z'|'A'..'Z'| '_' | '-' | '0'..'9' | '%' |'#' |'.')+ '!important'?;

问题在于在STYLE_VALUE标记的末尾声明'.'。当我声明它时,我在解析 var1.x 之后立即得到 NoViableAltException ,这可能是由于 modelVariable 匹配为STYLE_VALUE而不是作为一个文本。

如何将TEXT(STYLE_VALUE)的子集匹配为* STYLE_VALUE *和'。 TEXT 匹配为TEXT,前面有一个点?

1 个答案:

答案 0 :(得分:1)

如果您希望词法分析器将var1.x视为3个单独的令牌(var1.x),那么您需要确保没有词法分析器规则可以包含.和其他两个令牌中的任何一个。首先,您需要删除STYLE_VALUE词法分析器规则。您还需要创建以下词法分析器规则,'.'不应出现在任何其他词法分析器规则中。

DOT : '.';

您不需要在词法分析器中处理样式值的语法,而是需要在解析器中处理它,以确保始终正确处理DOT