2013-05-29 4 views
2

Есть ли общедоступный грамматика или парсер для ARM унифицированное Ассемблер, как описано в ARM Architecture Reference Manual A4.2ARM Unified Assembler Языковая грамматика и парсер?

Этот документ использует ARM Unified Assembler Language (UAL). Этот синтаксис языка ассемблера предоставляет каноническую форму для всех инструкций ARM и Thumb.

UAL описывает синтаксис для мнемоники и операндов каждой команды.

Просто я заинтересован в коде для разбора мнемоника и операнды каждой команды. Например, как вы могли бы определить грамматику для этих строк?

ADC{S}{<c>}{<q>} {<Rd>,} <Rn>, <Rm>, <type> <Rs> 
IT{<x>{<y>{<z>}}}{<q>} <firstcond> 
LDC{L}<c> <coproc>, <CRd>, [<Rn>, #+/-<imm>]{!} 
+0

@dwelch Я попытался улучшить вопрос. – auselen

+0

Релевантно: [Ubuntu на ARM-ассемблере] (https://wiki.ubuntu.com/ARM/Thumb2PortingHowto#Types_of_Assembly_Language)? –

+0

Извините, я неправильно понял вопрос. Возможно, gnu-ассемблер или gnu c имеет то, что вы можете использовать. –

ответ

2

Если вам необходимо создать простой анализатор, основанный на примере на основе грамматики, ничто не сравнится 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, если это имеет значение для вас. Если вам нужно только обработать подмножество инструкций, тогда это хороший способ.

+0

+1, так что если я правильно понимаю, если я скопирую и вставляю все инструкции в файл, antlr может создать из него грамматику? – auselen

+0

некоторый список инструкций https://gist.github.com/auselen/5681633 – auselen

+0

Жаль, что я так долго не был. Нет - просто, если вы переводите этот список инструкций в грамматику ANTLR (что не так сложно), вы получаете автоматически сгенерированный лексер и парсер. Я готов помочь, так как он мне тоже полезен. –

Смежные вопросы