我想实现一个" .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总是匹配字符串开头和结尾的空格:
答案 0 :(得分:2)
如果我理解你很好,我想你想让带有空格的字符串引用那里的所有元素。你可以解决问题并告诉词法分析器“除了...之外的任何东西”,它会尊重空格直到你的下一个引用。我建议你定义你的字符串(引号之间),如下所示:
DOUBLEQUOTED_STRING
: '"' ( ~('"') )* '"' ;
我希望这有帮助!
答案 1 :(得分:0)
空间不匹配,因为您要将其发送到HIDDEN频道。你没有在这里发表完整的语法 - 我的意思是既然你在谈论访问者,那么这里也应该有一些解析器规则。 所以要么在HIDDEN频道做某事,要么不在那里发送空间。 定义像
这样的空间WS: ' ';
而不是在OPCODE_ASCII或其中使用WS。要匹配更多空格,请使用quatifiers。