任何不跳过规则空间的方法?

时间:2014-10-24 17:12:45

标签: antlr antlr4

我想实现一个" .ascii"我的汇编程序的指令。 "之间的一切......"被认为是一个ascii字符串,写入我的目标文件。

 mips32code : instruction+ # StartPlace
            ;

instruction : OPCODE_RTYPE rd COMMA rs COMMA rt                     # RTypeInstruction
            | OPCODE_ASCII '"' ascii '"'                            # ASCIITypeInstruction
            ;

ascii       : instruction # asciiformat
            | NAME        # asciiname
            ;

INT   : [0-9A-Fa-f]+
      ;

NAME  : [A-Za-z]+[0-9]+
      ;

LABELD        : '!' 
              ;

LABELDEF      : ':' 
              ;

COMMA         : ',' 
              ;

VALUE         : ('$'|'0x')+
              ;

LINE_COMMENT
              : (';'|'//') ~[\r\n]* -> skip
              ;

BLOCK_COMMENT
              : ('/*' .*? (EOF | '*/')) -> skip
              ;

WS
              : (' ' | '\r' | '\n') -> channel(HIDDEN)
              ;

在这里," NAME"用于ascii字符串。我的一切正常,我的访问者成功地将ascii字符串写入我的测试文件,但是ANTLR4与我的ascii字符串中的空格不匹配。我现在该怎么办?我不想匹配空间并保持忽略所有其他规则。但是有可能实现在这种情况下匹配空间的异常吗?

编辑: 我也很困惑为什么ANTLR4总是匹配字符串开头和结尾的空格:

Problem 1

2 个答案:

答案 0 :(得分:2)

如果我理解你很好,我想你想让带有空格的字符串引用那里的所有元素。你可以解决问题并告诉词法分析器“除了...之外的任何东西”,它会尊重空格直到你的下一个引用。我建议你定义你的字符串(引号之间),如下所示:

DOUBLEQUOTED_STRING
    :   '"' ( ~('"') )* '"' ;

我希望这有帮助!

答案 1 :(得分:0)

空间不匹配,因为您要将其发送到HIDDEN频道。你没有在这里发表完整的语法 - 我的意思是既然你在谈论访问者,那么这里也应该有一些解析器规则。 所以要么在HIDDEN频道做某事,要么不在那里发送空间。 定义像

这样的空间
WS: ' ';

而不是在OPCODE_ASCII或其中使用WS。要匹配更多空格,请使用quatifiers。