0

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

var1.x , "cssStyleName : styleValue";

cssStyleName 和 styleValue 是……嗯……符合 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。

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

4

1 回答 1

1

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

DOT : '.';

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

于 2013-07-08T09:42:40.007 回答