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}