繁体   English   中英

我将如何匹配其他东西? (ANTLR4)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM