我想在antlr中定义一个规则,该字段由三部分组成:模型,表,列。分隔符为“。”,同时,模型可以是任何字符,这意味着模型也可以具有字符“。”。
但是,如果我为模型定义了一个可以匹配任何字符的正则表达式,那么应该被识别为表或列的输入部分将作为模型的一部分进行匹配。 例如,我有一个字符串“ @ ABC @ .def.cdf.efa.adef”,我想将一个模型命名为“ @ ABC @ .def.cdf”,将表命名为“ efa”,将列命名为“ adef” ,但实际上我得到的是模型为'@ ABC @ .def.cdf',表为空,列为空。
/** Grammers always start with a grammer header. This grammer */
/** is called MerakDsl and must match the filename: MerakDsl.g4 */
grammar Formula;
prog
: expression
;
expression
: left=expression operator=(MUL | DIV) right=expression # arithmeticBinary
| left=expression operator=(PLUS | MINUS) right=expression # arithmeticBinary
| '(' expression ')' # parens
| field # fields
;
field
: model '.' table '.' column # physicalField
| NUM # numeric
;
model
: CN #modelName
;
table
: ID #tableName
;
column
: ID #columnId
;
MUL : '*';
DIV : '/';
PLUS: '+';
MINUS: '-';
//NUM : [-+]?[0-9]+;
//NUM : [-]?[0-9]+(.[0-9]+)?;
NUM : ('-'|'+')?(DIGIT*'.'?DIGIT+);
// FILED(INDEX/DIM)
ID : STRING+;
CN : (.)+;
WS : [ \t\r\n]+ -> skip ; // toss out whitespace
那么如何在不影响其他规则的情况下匹配Antlr中的任何字符?