Antlr4 标识符Lexer规则不匹配'*';就像它应该的那样

Antlr4 标识符Lexer规则不匹配'*';就像它应该的那样,antlr4,Antlr4,我正在完成一个专有模式语言的语法。它借用了一些正则表达式语法元素(如量词),但它也比正则表达式复杂得多,因为它必须允许宏、不同的模式样式等 我的问题是“*”与ID lexer规则不匹配。在我看来,没有其他规则可以吞下*标记 这是我写的语法: grammar Pattern; element: ID | macro; macro: MACRONAME macroarg? ('*'|'+'|'?'|FROMTIL)?; macroarg: '['

我正在完成一个专有模式语言的语法。它借用了一些正则表达式语法元素(如量词),但它也比正则表达式复杂得多,因为它必须允许宏、不同的模式样式等

我的问题是“*”与ID lexer规则不匹配。在我看来,没有其他规则可以吞下*标记

这是我写的语法:

grammar Pattern;

element:
        ID
        | macro;

macro:
        MACRONAME macroarg? ('*'|'+'|'?'|FROMTIL)?;

macroarg: '['( (element | MACROFREE ) ';')* (element | MACROFREE) ']';


and_con :
        element '&' element
        | and_con '&' element
        |'(' and_con ')';

head_con :
        'H[' block '=>' block ']';

expression :
        element
        | and_con
        | expression ' ' element
        | '(' expression ')';

block :
        element
        | and_con
        | or_con
        | '(' block ')';

blocksequence :
        (block ' '+)* block;

or_con :
         ((element | and_con) '|')+ (element | and_con)
        | or_con '|' (element | and_con)
        | '(' blocksequence (')|(' blocksequence)+ (')'|')*');

patternlist :
        (blocksequence ' '* ',' ' '*)* blocksequence;

sentenceord :
        'S=(' patternlist ')';

sentenceunord :
        'S={' patternlist '}';

pattern :
        sentenceord
        | sentenceunord
        |  blocksequence;      

multisentence :
        MS pattern;

clause :
        'CLS' ' '+ pattern;

complexpattern :
        pattern
        | multisentence
        | clause
        | SECTIONS ' ' complexpattern;

dictentry:
        NUM ';' complexpattern
        | NUM ';' NAME ';' complexpattern
        | COMMENT;

dictionary:
        (dictentry ('\r'|'\n'))* (dictentry)?;

ID : '*' ('*'|'+'|'?'|FROMTIL)?
        | ( '^'? '!'? ('F'|'C'|'L'|'P'|'CA'|'N'|'PE'|'G'|'CD'|'T'|'M'|'D')'=' NAME ('*'|'+'|'?'|FROMTIL)? '$'? );

MS : 'MS' [0-9];

SECTIONS: 'SEC' '=' ([0-9]+','?)+;

FROMTIL: '{'NUM'-'NUM'}';

NUM: [0-9]+;

NAME: CHAR+ | ',' | '.' | '*';

CHAR: [a-zA-Z0-9_äöüßÄÖÜ\-];

MACRONAME: '#'[a-zA-Z_][a-zA-Z_0-9]*;

MACROFREE: [a-zA-Z!]+;

COMMENT: '//' ~('\r'|'\n')*;

complexpattern/pattern/element/block解析器规则应该接受一个简单的“*”,我不明白为什么它们不接受。

在您的
规则中,您定义了文本
“*”
,导致
ID
规则不匹配单个
“*”
作为输入。

宏规则不需要['在考虑匹配之前(因为macroarg规则)?否,解析器规则中的
'*'
文本将优先于其他词法规则。通过在其自己的词法规则中移动('''+'''.''?''.'FROMTIL)块来解决此问题,如:重复:(''.'+'.''''.''?'FROMTIL');