我正在测试ANTLR的词汇规则,但是发现与所使用的表达式规则有些差异。
例如。
CN : (CHN|STRING)+;
此规则只能匹配以中文开头的字符和不能匹配字母的字符。
model
: CN (.*?) #modelName
| ID (.*?) #modelName
;
此通配符(。*?)语法规则只能匹配当前定义的词法规则(例如DOT,NUM,ID,CN)。它不能与任何其他字符匹配。
Formula.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
| ID (.*?) #modelName
;
table
: ID #tableName
;
column
: ID #columnId
;
SLIDE_OP: DIM_EQ | DIM_FORWARD_OFFSET | DIM_BACKWARD_OFFSET;
DIM_EQ: '==';
DIM_FORWARD_OFFSET: '<<';
DIM_BACKWARD_OFFSET: '>>';
MUL : '*';
DIV : '/';
PLUS: '+';
MINUS: '-';
EQ : '=';
NEQ : '<>' | '!=';
LT : '<';
LTE : '<=';
GT : '>';
GTE : '>=';
fragment DIGIT : [0-9];
fragment STRING : [a-zA-Z0-9_];
fragment CHN : [\u2E80-\u9FFF];
DOT : [#@$%];
NUM : ('-'|'+')?(DIGIT*'.'?DIGIT+);
ID : STRING+;
CN : (CHN|STRING)+;
WS : [ \t\r\n]+ -> skip ;
// test case: aaV1.2.3-@#$*.d.b.c
我希望通配符可以匹配任何字符。 (CHN | STRING)+此规则可以匹配以中文,字母或数字开头的字符串。
答案 0 :(得分:0)
是的,在解析器规则.
中表示“任何令牌”,而不是“任何字符”。在解析器规则中表达“任何字符”的概念是不可能的,因为解析器不会获取字符作为输入,而是获取词法分析器生成的令牌。
您可以做的是在语法结尾¹定义词法规则OTHER: .;
。这样,任何未知字符都会产生一个OTHER
令牌,然后可以在解析器规则中与.
进行匹配。
¹出于其他原因,这也是一个好主意,例如将词法分析器错误转换为解析器错误,可以由解析器的错误侦听器处理。