gpt4 book ai didi

java - 十六进制和操作码之间的 ANTLR 歧义

转载 作者:行者123 更新时间:2023-11-30 03:52:25 28 4
gpt4 key购买 nike

我正在为基本汇编语言编写一个简单的组合词法分析器/解析器。我的问题是,在解析操作码时,我需要解析一些十六进制,它是指令计数器,可能是立即值等,以及实际的操作码。

基本上,当解析像 add 这样的东西时,有几种可能性,我可以有一个基本的 add 或带有条件代码 addeq 的添加>。这里的问题是 add 也是一个有效的十六进制序列,因此我收到一个词法分析器错误,指出 line 1:4 token recognize error at: 'q'。当然,如果我注释掉 HEX 规则,并忽略我需要解析偏移量的事实,错误就会消失;这就是我找到错误根源的方法。

示例行如下所示:0000b3ec addeq。正如您所看到的,它贪婪地将其解析为十六进制,而不是匹配 add 标记,然后匹配 eq 标记。

我想知道如何切换上下文,以便在这种情况下我可以忽略此序列中出现十六进制的可能性。我对分离我的词法分析器/语法并不感到兴奋,但如果绝对需要的话我可以。 pushModepopMode 似乎是在正确的方向,或者以某种方式是非贪婪的规则,但我有点不知所措。我真的很感激对此类问题的任何见解,因为匹配的上下文似乎非常适合正确地词法分析和解析。

我正在使用 Antlr4。

    grammar failadd;
opcode : add cond_code?
;
cond_code : COND_CODE;
add : ADDS | ADD;

ADD : 'add';
ADDS : 'adds';

COND_CODE : CC_EQ;
CC_EQ : 'eq';
HEX32 : SINGLEHEX SINGLEHEX SINGLEHEX SINGLEHEX SINGLEHEX SINGLEHEX SINGLEHEX SINGLEHEX;
HEX16 : SINGLEHEX SINGLEHEX SINGLEHEX SINGLEHEX;
SINGLEHEX : [a-fA-F0-9];
WS : [ \n\t\r]+ -> skip;

最佳答案

处理此问题的一种方法是在定义十六进制标记的方式中使用一些前瞻。

注意:以下不是解决方案......而是指向解决方案的指针。

<小时/>

如果 ANTLR 使用 Perl/Java/Javascript/etc 风格的正则表达式来指定词汇标记,那么您可以定义如下所示的“十六进制”标记:

[a-fA-F0-9]+($=[^a-zA-Z0-9])

即十六进制数字后跟一个零宽度的前瞻,用于非字母、非数字。如果您确实需要在语法中使用不同“大小”的十六进制数,请将 + 更改为更受限制的重复。

请注意,前瞻必须排除十六进制字符以及其他字母,否则最终可能会将“addeq”分析为 HEX16("adde") Identifier("q")

<小时/>

经过一些进一步的研究,我意识到 ANTLR 使用的是一种更简单、更纯粹的正则表达式,它不支持先行语法。不过,我认为您仍然应该能够使用 Java 中实现的语法操作来实现前瞻。请参阅引用文献中的想法,尤其是第二个。

引用文献:

关于java - 十六进制和操作码之间的 ANTLR 歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24092097/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com