EBNF: префикс и суффиксоподобный оператор при создании кода сборки - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь записать 6809 сборку в EBNF, чтобы написать разбрасыватель деревьев парсер.

Я застрял на одном определенном производстве. В сборке 6809 вы можете использовать регистр в качестве операнда и дополнительно увеличивать или увеличивать его:

LDA 0,X+     ; loads A from X then bumps X by 1
LDD ,Y++     ; loads D from Y then bumps Y by 2
LDA 0,-U     ; decrements U by 1 then loads A from address in U
LDU ,--S     ; decrements S by 2 then loads U from address in S

Запомните «пропущенный» первый операнд во второй строке кода. Вот постановки, которые я написал:

instruction = opcode, [operand], ["," , register_exp];
...
register_exp = [{operator}], register | register, [{operator}];
register = "X" | "Y" | "U" | etc. ;
operator = "+" | "-";

Проблема в register_exp = .... Я чувствую, что мог бы быть более изящный способ определить это производство. Кроме того, что произойдет, если для register_exp будет дан только регистр?

1 Ответ

0 голосов
/ 01 сентября 2018

Вам, вероятно, нужно

register_exp = [{operator}], register | register, [{operator}] | register;

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

...