我怎么能在别的东西之前匹配? (ANTLR4)

时间:2014-10-26 14:29:01

标签: regex antlr4

目前,我已在我的代码中实施标签。它已经很好地工作,后面的标签工作。 (后退标签=标签必须在我跳转到它之前定义)现在我想做"前进"标签。简短说明我的意思(我在我的代码中说明)

!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 : ',' ;

2 个答案:

答案 0 :(得分:1)

解析输入两次。你的第一个解析,可能是一个只实现enterLabelDefinitionType(...)方法的监听器,"收集"标签。然后你解析它几秒钟,并将结果从第一个解析传递给它。

答案 1 :(得分:1)

您要做的是在语法阶段进行语义工作。你不应该这样做。让解析器完成它的工作,解析你的输入并给你结构。然后编写一个额外的阶段(语义阶段)来检查这个结构并验证所有标签。在这里你可以给出有意义的错误,而不是通用的"无法匹配任何预测的输入......"语法阶段的错误。