Если вам необходимо создать простой анализатор, основанный на примере на основе грамматики, ничто не сравнится 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>
Это дает дерево разбора с разбивкой на лексемы, правила и данные:
(программа (инструкция ADCS (reg r 1), (reg r 2), (reg r 3) \ n) (оператор IT (firstcond?) \ N) (оператор LDC (coproc p 3) (cpreg cr 2) (reg r 1), (imm # - 3)! \ n))
Грамматика еще не содержит коды условий инструкций или данные для инструкции IT вообще (я нажимаю на время). ANTLR генерирует лексер и парсер, а затем макрос grun обертывает их в тестовую установку, поэтому я могу запускать фрагменты текста через сгенерированный код. Сгенерированный API прямолинейен для использования в ваших собственных приложениях.
Для полноты, я искал онлайн для существующей грамматики и не нашел ее. Лучше всего, чтобы можно было отделить газ и извлечь его парсерную спецификацию, но это не будет синтаксис UAL, и это будет GPL, если это имеет значение для вас. Если вам нужно только обработать подмножество инструкций, тогда это хороший способ.
@dwelch Я попытался улучшить вопрос. – auselen
Релевантно: [Ubuntu на ARM-ассемблере] (https://wiki.ubuntu.com/ARM/Thumb2PortingHowto#Types_of_Assembly_Language)? –
Извините, я неправильно понял вопрос. Возможно, gnu-ассемблер или gnu c имеет то, что вы можете использовать. –