【问题标题】:EBNF: prefix and suffix-like operator in assembly code productionEBNF:汇编代码生产中的前缀和后缀运算符
【发布时间】:2018-09-01 18:39:00
【问题描述】:

我正在尝试在 EBNF 中写下 6809 assembly 以编写 tree-sitter 解析器。

我被困在某个特定的作品上。在 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一个寄存器会发生什么?

【问题讨论】:

    标签: ebnf


    【解决方案1】:

    你可能需要

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

    允许没有运算符的寄存器名称。为什么你觉得它不那么优雅?很有描述性。

    【讨论】:

    • 感觉很冗长,但是添加的| register 解决了我的另一个问题,谢谢!
    • 我的猜测是,尝试更紧凑地破解它最终会导致更多可怕的子例程,所以最好保持原样。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 2011-03-12
    • 2022-11-24
    相关资源
    最近更新 更多