如何处理Antlr.RunTime.InputMismatchException?
How to handle Antlr.RunTime.InputMismatchException?
我有一个使用 Antlr 解析 a2l 文件的项目。这是我的两个解析器规则:
...
enumMemSegmMem : enumMemSegmMem_ = ( EEPROM
| EPROM
| FLASH
| RAM_VALUE
| ROM_VALUE
| REGISTER
| NOT_IN_ECU)
... ;
subGroup : BEGIN_SUB_GROUP
(identifier += IDENT )*
END_SUB_GROUP
...
这是我的一些词法分析器规则:
...
BEGIN_SUB_GROUP : BEGIN WS 'SUB_GROUP'
;
...
END_SUB_GROUP : END WS 'SUB_GROUP'
;
...
RAM : 'RAM'
;
ROM : 'ROM'
;
...
IDENT : WORD_CHAR [a-zA-Z0-9_.[\]]*
;
...
WS : [ \t\r\n]+ -> skip
;
fragment WORD_CHAR : [a-zA-Z_]
;
当我有类似 BEGIN SUB_GROUP RAM END SUB_GROUP
的东西时,我得到 Antlr4.RunTime.InputMismatchException。
我希望项目在词法分析器规则中也发现标识符作为字符串文字时继续解析,并显示异常。
我试图将 IDENT 规则置于词法分析器规则中的所有规则之上,但我不希望所有单词都在那里匹配。
那是因为 ANTLR 不会为输入“RAM”创建 IDENT
令牌。这样的输入(“RAM”)将始终成为 RAM
令牌。
如果你想让这样的关键字在解析器中也作为标识符被匹配,你需要做这样的事情:
subGroup
: BEGIN_SUB_GROUP ident* END_SUB_GROUP
;
ident
: IDENT
| BEGIN
| END
| RAM
| ROM
// more keywords here?
;
我有一个使用 Antlr 解析 a2l 文件的项目。这是我的两个解析器规则:
...
enumMemSegmMem : enumMemSegmMem_ = ( EEPROM
| EPROM
| FLASH
| RAM_VALUE
| ROM_VALUE
| REGISTER
| NOT_IN_ECU)
... ;
subGroup : BEGIN_SUB_GROUP
(identifier += IDENT )*
END_SUB_GROUP
...
这是我的一些词法分析器规则:
...
BEGIN_SUB_GROUP : BEGIN WS 'SUB_GROUP'
;
...
END_SUB_GROUP : END WS 'SUB_GROUP'
;
...
RAM : 'RAM'
;
ROM : 'ROM'
;
...
IDENT : WORD_CHAR [a-zA-Z0-9_.[\]]*
;
...
WS : [ \t\r\n]+ -> skip
;
fragment WORD_CHAR : [a-zA-Z_]
;
当我有类似 BEGIN SUB_GROUP RAM END SUB_GROUP
的东西时,我得到 Antlr4.RunTime.InputMismatchException。
我希望项目在词法分析器规则中也发现标识符作为字符串文字时继续解析,并显示异常。
我试图将 IDENT 规则置于词法分析器规则中的所有规则之上,但我不希望所有单词都在那里匹配。
那是因为 ANTLR 不会为输入“RAM”创建 IDENT
令牌。这样的输入(“RAM”)将始终成为 RAM
令牌。
如果你想让这样的关键字在解析器中也作为标识符被匹配,你需要做这样的事情:
subGroup
: BEGIN_SUB_GROUP ident* END_SUB_GROUP
;
ident
: IDENT
| BEGIN
| END
| RAM
| ROM
// more keywords here?
;