Gcc 用于解析x86程序集的ANTLR4语法

Gcc 用于解析x86程序集的ANTLR4语法,gcc,x86,antlr4,grammar,Gcc,X86,Antlr4,Grammar,我编写了一些C++代码,并使用g++-S-masm=Intel-O3 main.cpp-o main.S将其编译成Intel风格的程序集。不过,我的问题可以通过以下简单的hello world程序重现 main.cpp: #include <iostream> int main() { std::cout << "Hello World" << std::endl; return 0; } 现在我想使用ANTLR语法来解析main.S中的汇

我编写了一些
C++
代码,并使用
g++-S-masm=Intel-O3 main.cpp-o main.S
将其编译成
Intel
风格的程序集。不过,我的问题可以通过以下简单的hello world程序重现

main.cpp

#include <iostream>

int main()
{
    std::cout << "Hello World" << std::endl;
    return 0;
}
现在我想使用
ANTLR
语法来解析
main.S
中的汇编代码。我试过提供的那个,因为它看起来很有希望。然而,我得到了大量的解析错误。它不打算用于此任务吗?是否有其他语法更适合解析生成的程序集

分析树检查器

Lexer
输出:

line 1:7 token recognition error at: '"'
line 5:6 token recognition error at: '_'
line 5:7 token recognition error at: '_'
line 5:8 token recognition error at: '_'
line 6:0 token recognition error at: '_'
line 6:1 token recognition error at: '_'
line 6:2 token recognition error at: '_'
line 9:22 token recognition error at: '_'
line 9:23 token recognition error at: '_'
line 10:5 token recognition error at: '_'
line 10:6 token recognition error at: '_'
line 13:6 token recognition error at: '_'
line 13:7 token recognition error at: '_'
line 13:8 token recognition error at: '_'
line 14:17 token recognition error at: '"'
line 16:8 token recognition error at: '"'
line 16:20 token recognition error at: '\'
line 16:22 token recognition error at: '"'
line 17:24 token recognition error at: '"'
line 19:8 token recognition error at: '_'
line 20:6 token recognition error at: '_'
line 21:0 token recognition error at: '_'
line 31:6 token recognition error at: '_'
line 31:7 token recognition error at: '_'
line 31:8 token recognition error at: '_'
line 34:34 token recognition error at: '_'
line 34:35 token recognition error at: '_'
line 35:6 token recognition error at: '_'
line 35:7 token recognition error at: '_'
line 36:34 token recognition error at: '_'
line 36:35 token recognition error at: '_'
line 37:6 token recognition error at: '_'
line 37:7 token recognition error at: '_'
line 46:6 token recognition error at: '_'
line 46:7 token recognition error at: '_'
line 47:0 token recognition error at: '_'
line 47:1 token recognition error at: '_'
line 52:22 token recognition error at: '_'
line 52:23 token recognition error at: '_'
line 53:6 token recognition error at: '_'
line 53:7 token recognition error at: '_'
line 54:34 token recognition error at: '_'
line 54:35 token recognition error at: '_'
line 54:36 token recognition error at: '_'
line 55:6 token recognition error at: '_'
line 61:17 token recognition error at: '"'
line 63:7 token recognition error at: '_'
line 63:8 token recognition error at: '_'
line 64:7 token recognition error at: '_'
line 64:8 token recognition error at: '_'
line 65:8 token recognition error at: '"'
line 66:6 token recognition error at: '_'
line 66:7 token recognition error at: '_'
line 67:6 token recognition error at: '_'
line 67:7 token recognition error at: '_'
line 68:6 token recognition error at: '_'
line 68:7 token recognition error at: '_'
line 69:6 token recognition error at: '_'
line 69:7 token recognition error at: '_'
line 70:6 token recognition error at: '_'
line 1:17 no viable alternative at input 'main.cpp"\r\n'
line 2:23 no viable alternative at input 'noprefix\r\n'
line 4:10 mismatched input '4' expecting {'!', EOL}

阅读该语法并查看生成的AST,很容易看到像
.p2align 4,15
这样的行与标记
.p2align
的规则
lbl
匹配,然后
4,15
与任何
汇编指令或
指令都不匹配

所以,,这不是你要找的语法

我不知道gas是否存在任何ANTLR语法,但是语法大多(完全?)基于以点开头的指令行。
这很容易解析

如果你还需要解析代码,考虑使用AT&T(哦,孩子,我不敢相信我这么说),因为它很容易被解析。 如果您想坚持使用英特尔的语法,我认为您首先不需要LL解析器,因为汇编语言应该是常规的。

使用简单的FSM或正则表达式可能更容易、更有效。

阅读该语法,并查看生成的AST,很容易看到像
.p2align 4,15
这样的行与令牌
.p2align
的规则
lbl
相匹配,然后
4,,,15
与任何
汇编指令
指令
不匹配

所以,,这不是你要找的语法

我不知道gas是否存在任何ANTLR语法,但是语法大多(完全?)基于以点开头的指令行。
这很容易解析

如果你还需要解析代码,考虑使用AT&T(哦,孩子,我不敢相信我这么说),因为它很容易被解析。 如果您想坚持使用英特尔的语法,我认为您首先不需要LL解析器,因为汇编语言应该是常规的。
使用简单的FSM或正则表达式可能更容易、更有效

line 1:7 token recognition error at: '"'
line 5:6 token recognition error at: '_'
line 5:7 token recognition error at: '_'
line 5:8 token recognition error at: '_'
line 6:0 token recognition error at: '_'
line 6:1 token recognition error at: '_'
line 6:2 token recognition error at: '_'
line 9:22 token recognition error at: '_'
line 9:23 token recognition error at: '_'
line 10:5 token recognition error at: '_'
line 10:6 token recognition error at: '_'
line 13:6 token recognition error at: '_'
line 13:7 token recognition error at: '_'
line 13:8 token recognition error at: '_'
line 14:17 token recognition error at: '"'
line 16:8 token recognition error at: '"'
line 16:20 token recognition error at: '\'
line 16:22 token recognition error at: '"'
line 17:24 token recognition error at: '"'
line 19:8 token recognition error at: '_'
line 20:6 token recognition error at: '_'
line 21:0 token recognition error at: '_'
line 31:6 token recognition error at: '_'
line 31:7 token recognition error at: '_'
line 31:8 token recognition error at: '_'
line 34:34 token recognition error at: '_'
line 34:35 token recognition error at: '_'
line 35:6 token recognition error at: '_'
line 35:7 token recognition error at: '_'
line 36:34 token recognition error at: '_'
line 36:35 token recognition error at: '_'
line 37:6 token recognition error at: '_'
line 37:7 token recognition error at: '_'
line 46:6 token recognition error at: '_'
line 46:7 token recognition error at: '_'
line 47:0 token recognition error at: '_'
line 47:1 token recognition error at: '_'
line 52:22 token recognition error at: '_'
line 52:23 token recognition error at: '_'
line 53:6 token recognition error at: '_'
line 53:7 token recognition error at: '_'
line 54:34 token recognition error at: '_'
line 54:35 token recognition error at: '_'
line 54:36 token recognition error at: '_'
line 55:6 token recognition error at: '_'
line 61:17 token recognition error at: '"'
line 63:7 token recognition error at: '_'
line 63:8 token recognition error at: '_'
line 64:7 token recognition error at: '_'
line 64:8 token recognition error at: '_'
line 65:8 token recognition error at: '"'
line 66:6 token recognition error at: '_'
line 66:7 token recognition error at: '_'
line 67:6 token recognition error at: '_'
line 67:7 token recognition error at: '_'
line 68:6 token recognition error at: '_'
line 68:7 token recognition error at: '_'
line 69:6 token recognition error at: '_'
line 69:7 token recognition error at: '_'
line 70:6 token recognition error at: '_'
line 1:17 no viable alternative at input 'main.cpp"\r\n'
line 2:23 no viable alternative at input 'noprefix\r\n'
line 4:10 mismatched input '4' expecting {'!', EOL}