目前,我已在我的代码中实施标签。它已经很好地工作,后面的标签工作。 (后退标签=标签必须在我跳转到它之前定义)现在我想做"前进"标签。简短说明我的意思(我在我的代码中说明)
!Test:
LUI A0, 0x144D
JAL 0x8033D548
!Main:
ADDIU T0, T1, 0x0001
BEQ T0, T1, !Test ; Branch if T0 == T1
以上的工作已经完成,因为测试是在之前定义的,因此我可以向后跳转#34;从中。但是,以下工作尚未完成:
!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 : ',' ;
答案 0 :(得分:1)
解析输入两次。你的第一个解析,可能是一个只实现enterLabelDefinitionType(...)
方法的监听器,"收集"标签。然后你解析它几秒钟,并将结果从第一个解析传递给它。
答案 1 :(得分:1)
您要做的是在语法阶段进行语义工作。你不应该这样做。让解析器完成它的工作,解析你的输入并给你结构。然后编写一个额外的阶段(语义阶段)来检查这个结构并验证所有标签。在这里你可以给出有意义的错误,而不是通用的"无法匹配任何预测的输入......"语法阶段的错误。