[英]How would I match something before anything else? (ANTLR4)
目前,我正在代码中实现标签。 它已经很好地工作了,向后标签也在起作用。 (向后标签=必须先定义标签,然后才能跳转到该标签)现在我想制作“向前”标签。 简短说明我的意思(我在代码中进行了说明)
!Test:
LUI A0, 0x144D
JAL 0x8033D548
!Main:
ADDIU T0, T1, 0x0001
BEQ T0, T1, !Test ; Branch if T0 == T1
上面的测试已经生效,因为测试是在之前定义的,因此我可以从测试中“跳回”。 但是,以下操作尚无法使用:
!Test:
LUI A0, 0x144D
JAL 0x8033D548
NOP
BEQ T0, T1, !Main // Talking about this one here. Forward Label Jump.
!Main:
ADDIU T0, T1, 0x0001
BEQ T0, T1, !Test // Branch if T0 == T1, Backward Label Jump
基本上,我有两种方式:我为正向标签编写了一个全新的函数,或者在匹配其他任何内容之前找出了如何匹配“标签定义”(!Labelname :)。 我相信第二种方法将是最好和最短的方法。 所以,我想问是否有可能在其他之前匹配我的标签?
这是我的语法:
mips32code : instruction+ # StartPlace
;
instruction : OPCODE_ITYPE rt COMMA rs COMMA VALUE imm # ITypeInstruction
| OPCODE_LUITYPE rt COMMA VALUE imm # LuiTypeInstruction
| LABELD NAME LABELDEF # LabelDefinitionType
;
imm : instruction # immformat
| INT # immvalue
;
rs : instruction # rsexpr
| REG # rsreg
;
rt : instruction # rtexpr
| REG # rtreg
;
OPCODE_ITYPE
: [aA] [dD] [dD] [iI] // ADDI
| [dD] [aA] [dD] [dD] [iI] // DADDI
| [dD] [aA] [dD] [dD] [iI] [uU] // DADDIU
| [aA] [dD] [dD] [iI] [uU] // ADDIU
| [oO] [rR] [iI] // ORI
| [xX] [oO] [rR] [iI] // XORI
| [sS] [lL] [tT] [iI] // SLTI
| [sS] [lL] [tT] [iI] [uU] // SLTIU
| [aA] [nN] [dD] [iI] // ANDI
;
OPCODE_LUITYPE
: [lL] [uU] [iI] // LUI
;
REG
: [rR] '0'
| [aA] [tT]
| [vV] [01]
| [aA] [0-3]
| [tT] [0-9]
| [sS] [0-8]
| [kK] [01]
| [gG] [aA]
| [sS] [pP]
| [fF] [pP]
| [rR] [aA]
;
LABELD : '!' ;
LABELDEF : ':' ;
NAME : [A-Za-z]+;
INT : [0-9A-Fa-f]+;
VALUE : ('$'|'0x')+;
COMMA : ',' ;
将输入解析两次。 您的第一个解析(可能是仅实现enterLabelDefinitionType(...)
方法的侦听器enterLabelDefinitionType(...)
“收集”标签。 然后您将其解析一秒钟,然后将第一次解析的结果传递给它。
您想要做的是在语法阶段进行语义工作。 你不应该那样做。 让解析器执行它的工作,以解析您的输入并为您提供结构。 然后编写一个附加阶段(语义阶段)以检查此结构并验证所有标签。 在这里,您可以给出有意义的错误,而不是句法阶段出现的常规“无法匹配任何预测的输入...”错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.