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