📜  LR 0项目的规范集合(1)

📅  最后修改于: 2023-12-03 15:32:45.528000             🧑  作者: Mango

LR 0 项目的规范集合

LR 0 项目是编译原理中常用的一种项目,它用于构建语法分析器。在进行 LR 0 项目的处理过程中,我们需要遵循一些规范来确保程序的正确性和可读性。

规范一:符号的命名

项目中使用的符号(Terminal Symbol、Non-Terminal Symbol)需要有一个明确的命名规则,以便代码的可读性和可维护性。符号的命名应该具有语义化,清晰明了,并且要与上下文中的语义关联紧密,以便于快速理解。

例如:

// Terminal symbols
#define PLUS '+'
#define MINUS '-'
#define MULTIPLY '*'
#define DIVIDE '/'
#define NUMBER 'number'
#define LPAREN '('
#define RPAREN ')'
// Non-Terminal symbols
#define EXPRESSION 'expression'
#define TERM 'term'
#define FACTOR 'factor'
规范二:项目的结构

LR 0 项目的结构也需要有一定的规范。在项目中,应该包含以下信息:

  • 项目编号(Item Number):记录该项目在 LR 0 自动机中的位置;
  • 产生式(Production):记录产生式的左部和右部;
  • Lookahead 集合:表示预测集合,也就是在读入某个符号之后,所能推导出的所有符号集合。

例如:

I2: EXPRESSION -> TERM . ADDSUB // Lookahead = {EOF, +, -}
规范三:项目的转移关系

在给出 LR 0 自动机时,需要准确地记录每个项目之间的转移关系。在不同的转移关系中,需要明确地标记出转移的条件,即读入的当前符号。

例如:

I0 -> I1 (expression)
I0 -> I2 (term)
I1 -> I3 (+)
I1 -> I4 (-)
I2 -> I5 (*)
I2 -> I6 (/)
规范四:状态表和动作表的生成

在 LR 0 自动机构建完成后,我们需要生成状态表和动作表。在生成过程中,需要遵循以下规范:

  • 状态表要按照项目集编号从小到大排序;
  • 动作表需要考虑不同类型的转移和规约操作,并要按照操作顺序生成代码。

例如:

状态表:

| | + | - | * | / | number | ( | ) | EOF | | ---- | ---- | ---- | ---- | ---- | ------ | ---- | ---- | ---- | | I0 | | | | | I2 | I1 | | | | I1 | I3 | I4 | | | | | Acc | Acc | | I2 | I8 | I9 | | | | | | Acc | | I3 | | | I5 | I6 | | | | | | I4 | | | I5 | I6 | | | | | | I5 | | | | | I10 | | | | | I6 | | | | | I11 | | | | | I7 | I3 | I4 | | | | | | | | I8 | | | I5 | I6 | | | | | | I9 | | | I5 | I6 | | | | | | I10 | | | | | | | R3 | R3 | | I11 | | | | | | | R4 | R4 |

动作表:

| | + | - | * | / | number | ( | ) | EOF | | -- | -------- | -------- | -------- | -------- | -------- | ------------ | ------------ | ---- | | 0 | Shift I8 | Shift I9 | | | Shift I2 | Shift I1 | | | | 1 | Reduce R5| Reduce R5| | | Reduce R5| Reduce R5 | Accept | Accept| | 2 | Shift I8 | Shift I9 | | | Shift I2 | Shift I1 | | | | 3 | | | Shift I5 | Shift I6 | | | | | | 4 | | | Shift I5 | Shift I6 | | | | | | 5 | | | | | Shift I10| Shift I7 | | | | 6 | | | | | Shift I11| Shift I7 | | | | 7 | Shift I8 | Shift I9 | | | | Shift I12 | | | | 8 | | | Shift I5 | Shift I6 | | | | | | 9 | | | Shift I5 | Shift I6 | | | | | | 10 | | | | | | | Reduce R3 | Reduce R3| | 11 | | | | | | | Reduce R4 | Reduce R4|

按照上述规范,我们可以有效地构建 LR 0 语法分析器,提高代码的可读性和可维护性。