Анализатор JavaCC с языка ассемблера на машинный код - проблема разделения команд - PullRequest
1 голос
/ 15 марта 2011

HY. Я пытаюсь создать синтаксический анализатор с использованием JavaCC (ассемблер) для преобразования из кода сборки (Microcontroller 8051) в код машины. Я читал о грамматике javaCC и ее структуре, но у меня возникла дилемма Например, у меня есть инструкция ADD:

`ADD A,Rn`   or   `ADD  A,@Ri` 

и для каждого из них у меня есть машинный код (гекса код), например: ADD A,R0 переводится в 28H. А также я могу иметь инструкцию MOV:
MOV A,Rn или MOV A,@Ri но у меня также есть MOV data_addr,Rn и MOV R6,#data и т. Д.

Теперь моя проблема в том, как мне сделать эту разницу между двумя инструкциями. Предположим, я определил свои токены следующим образом:
Token{<br> <IN_MOV :"mov"><br> |<IN_ADD:"add"<br> }
я не мог определить функции для каждого токена, чтобы функция определяла определенное поведение, потому что у меня много инструкций. Сказать, что token.image==.equals("mov"), then go on one direction to the specific behaviour это немного, не правда ли? .... так что я в значительной степени застрял. Я не знаю, куда идти.
Спасибо за помощь.!

Ответы [ 2 ]

3 голосов
/ 15 марта 2011

Кажется, вы ожидаете слишком многого от лексера. Лексер - это конечный автомат, а синтаксический анализатор - нет.

Таким образом, лексер должен создавать токены для инструкций (MOV, ADD, ...) и токены для операндов. Лексер не должен пытаться быть слишком умным и ожидать определенных операндов для конкретных инструкций.

Теперь парсер может ожидать определенные комбинации команд и операндов. Например, вы можете принимать только @ операндов с инструкцией MOV, поэтому любой другой операнд вызовет исключение синтаксического анализа.

Если вам нужно дополнительно проверить комбинацию инструкций и операндов, вы должны сделать это в коде производств. Например, вы можете рассматривать два идентичных операнда как ошибку для некоторых инструкций; это очень трудно выразить в производстве, но тривиально в коде.

Если вам необходимо выполнить дальнейшую проверку, например, путем обнаружения недопустимых последовательностей инструкций, вам придется поддерживать состояние во всех производствах или даже создавать AST и обрабатывать его после завершения анализа.

0 голосов
/ 19 марта 2011

См. полная грамматика языка ассемблера , где вы найдете множество примеров того, что вам нужно написать в своем парсере для ассемблерного кода.

...