Antlr4 antlr的规则与正则表达式的正则表达式不同吗?

Antlr4 antlr的规则与正则表达式的正则表达式不同吗?,antlr4,Antlr4,我正在测试ANTLR的词汇规则,但我发现与所使用的表达式规则有些不同 给埃克斯梅普 CN : (CHN|STRING)+; 此规则只能匹配以中文开头的字符和不能匹配字母的字符 model : CN (.*?) #modelName | ID (.*?) #modelName ; 此通配符(.*)语法规则只能与当前定义的词汇规则(例如点、NUM、ID、CN)匹配。它不能匹配任何其他字符 Formula.g4 grammar Formula; prog :

我正在测试ANTLR的词汇规则,但我发现与所使用的表达式规则有些不同

给埃克斯梅普

CN  : (CHN|STRING)+; 
此规则只能匹配以中文开头的字符和不能匹配字母的字符

model
   : CN (.*?)  #modelName
   | ID (.*?)  #modelName
   ;  
此通配符(.*)语法规则只能与当前定义的词汇规则(例如点、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
Formula.g4
语法公式;
掠夺
:表达
;
表达
:left=表达式运算符=(MUL | DIV)right=表达式#算术二进制
|左=表达式运算符=(加|减)右=表达式#算术二进制
|“(“表达式”)”帕伦斯
|字段#字段
;
领域
:模型“.”表“.”列#物理字段
|数值
;
模型
:CN(.*)#modelName
|ID(.*)#型号名称
;
桌子
:ID#表名
;
柱
:ID#columnId
;
滑动操作:尺寸相等|尺寸向前|偏移|尺寸向后|偏移;
DIM_EQ:'=';
DIM\U FORWARD\U偏移量:“”;
MUL:“*”;
分区:“/”;
加:“+”;
减:'-';
等式:'=';
NEQ:“|”!=”;
LT:'=';
碎片数字:[0-9];
碎片串:[a-zA-Z0-9_389;];
片段CHN:[\u2E80-\u9FFF];
点:[#@$%];
数字:('-'|'+')?(数字*'.'数字+);
ID:STRING+;
CN:(CHN |字符串)+;
WS:[\t\r\n]+->跳过;
//测试用例:aaV1.2.3-@#$*.d.b.c
我希望通配符可以匹配任何字符
(CHN | STRING)+此规则可以匹配以中文或字母或数字开头的字符串。

是的,在解析器规则中
表示“任何标记”,而不是“任何字符”。不可能在解析器规则中表达“任何字符”的概念,因为解析器不获取字符作为其输入-它获取lexer生成的标记

您可以做的是定义一个lexer规则
OTHER:在语法的末尾。这样,任何未知字符都将生成一个
其他
标记,然后可以通过解析器规则中的
进行匹配



出于其他原因,这也是一个好主意,例如将lexer错误转换为解析器的错误监听器可以处理的解析器错误。

是的,在解析器规则中
表示“任何标记”,而不是“任何字符”。不可能在解析器规则中表达“任何字符”的概念,因为解析器不获取字符作为其输入-它获取lexer生成的标记

您可以做的是定义一个lexer规则
OTHER:在语法的末尾。这样,任何未知字符都将生成一个
其他
标记,然后可以通过解析器规则中的
进行匹配


出于其他原因,这也是一个好主意,例如将lexer错误转换为解析器错误,解析器的错误监听器可以处理这些错误