如果您需要基于基于示例的语法创建一个简单的解析器,没有什么比 ANTLR 更好的了:
http://www.antlr.org/
ANTLR 将语法规范翻译成词法分析器和解析器代码。它比 Lexx 和 Yacc 使用起来更直观。下面的语法涵盖了您上面指定的部分内容,并且很容易扩展为您想要的内容:
grammar armasm;
/* Rules */
program: (statement | NEWLINE) +;
statement: (ADC (reg ',')? reg ',' reg ',' reg
| IT firstcond
| LDC coproc ',' cpreg (',' reg ',' imm )? ('!')? ) NEWLINE;
reg: 'r' INT;
coproc: 'p' INT;
cpreg: 'cr' INT;
imm: '#' ('+' | '-')? INT;
firstcond: '?';
/* Tokens */
ADC: 'ADC' ('S')? ;
IT: 'IT';
LDC: 'LDC' ('L')?;
INT: [0-9]+;
NEWLINE: '\r'? '\n';
WS: [ \t]+ -> skip;
从 ANTLR 站点(OSX 指令):
$ cd /usr/local/lib
$ wget http://antlr4.org/download/antlr-4.0-complete.jar
$ export CLASSPATH=".:/usr/local/lib/antlr-4.0-complete.jar:$CLASSPATH"
$ alias antlr4='java -jar /usr/local/lib/antlr-4.0-complete.jar'
$ alias grun='java org.antlr.v4.runtime.misc.TestRig'
然后在语法文件上运行:
antlr4 armasm.g4
javac *.java
grun armasm program -tree
ADCS r1, r2, r3
IT ?
LDC p3, cr2, r1, #3
<EOF>
这会产生分解为标记、规则和数据的解析树:
(program (statement ADCS (reg r 1) , (reg r 2) , (reg r 3) \n) (statement IT (firstcond ?) \n) (statement LDC (coproc p 3) (cpreg cr 2) (reg r 1) , (imm # - 3) ! \n))
语法还不包括指令条件代码,也不包括 IT 指令的详细信息(我时间紧迫)。ANTLR 生成一个词法分析器和解析器,然后 grun 宏将它们包装在一个测试装置中,这样我就可以通过生成的代码运行文本片段。生成的 API 可以直接在您自己的应用程序中使用。
为了完整起见,我在网上查找了现有的语法,但没有找到。您最好的选择可能是拆开 gasm 并提取其解析器规范,但它不会是 UAL 语法,如果这对您很重要,它将是 GPL。如果您只需要处理指令的子集,那么这是一个不错的方法。