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

antlr匹配解析器规则而不是令牌,antlr,Antlr,我正在尝试匹配以下序列: var1.x,“cssStyleName:styleValue” cssStyleName和styleValue是。。。好。。。符合css的样式,例如颜色:#000!重要的*宽度:99.94680851063829%;“等 inputSpecs: modelVariable (COMMA cssStyle )*; modelVariable: TEXT ('.' childVar)*; childVar : TEXT; cssStyle: styleName

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

var1.x,“cssStyleName:styleValue”

cssStyleName和styleValue是。。。好。。。符合css的样式,例如
颜色:#000!重要的*宽度: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_值标记的末尾声明
。当我声明它时,我在解析var1.x之后立即得到NoviableException,可能是因为modelVariable作为STYLE_值而不是文本匹配


如何将文本子集(STYLE_值)匹配为*STYLE_值*和“.”文本匹配为前面有点的文本?

如果您希望lexer将
var1.x
视为3个单独的标记(
var1
x
),然后您需要确保任何lexer规则都不能将
与其他两个标记中的任何一个包含在一起。首先,您需要删除
样式值
lexer规则。您还需要创建以下lexer规则,并且
'。
不应出现在任何其他lexer规则中

DOT : '.';

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

感谢您的回答280z28。我可以理解ANTLR迫使我在标记声明中非常具体,但如果ANTLR只听p的话会更简单arser声明。我通过替换:
样式值:哈希?文本(点文本)*(百分比)*优先级?;
解决了这个问题。缺点是现在我必须在样式值规则中包含所有可能的CSS值字符。难道没有办法匹配:和?