PL/0语言编译程序整理实现:(1)、语法描述EBNF
参考《编译原理(清华版)》中"PL/0语言编译程序"的源代码,重新整理和实现,以提高代码可阅读性和可理解性。
unit uGrammar_EBNF;
interface
(*
语法描述EBNF
<程序> ::= <分程序>.
<分程序> ::= [<常量声明部分>] [<变量声明部分>] [<过程声明部分>] <语句>
<常量声明部分> ::= CONST <常量定义序列> ;{<常量定义序列> ;}
<常量定义序列> ::= <常量定义> {,<常量定义>}
<常量定义> ::= <标识符> = <无符号整数>
<无符号整数> ::= <数字> {<数字>}
<变量声明部分> ::= VAR <变量定义序列>;{<变量定义序列>;}
<变量定义序列> ::= <标识符> |<数组> {,<标识符> |<数组>}
<数组> ::= <标识符>'[' <无符号整数> ']'
<标识符> ::= <字母>{<字母> |<数字>}
<过程声明部分> ::= <过程首部> <分程序> { ; <过程声明部分>};
<过程首部> ::= PROCEDURE <标识符>;
<语句> ::=< 赋值语句> | <条件语句> | <当型循环语句> | <REPEAT循环语句> | <过程调用语句> | <读语句> | <写语句> | <复合语句> | <空>
<赌值语句> ::= <标识符> | <数组> := <表达式>
<条件语句> ::= IF <条件> THEN <语句> [ ELSE <语句> ]
<当型循环语句> ::= WHILE <条件> DO <语句>
<REPEAT循环语句> ::= REPEAT <语句> {;<语句>} UNTIL <条件>
<过程调用语句> ::= CALL <标识符>
<读语句> ::= READ '(' <标识符> | <数组> {,<标识符> | <数组> } ')'
<写语句> ::= WRITE '(' <表达式> {,<表达式>} ')'
<复合语句> ::= BEGIN <语句>{;<语句>} END
<条件> ::= <表达式><关系运算符><表达式> | ODD <表达式>
<表达式> ::= <+|-> <项>{<加法运算符><项>}
<项> ::= <因子> {<乘法运算符><因子>}
<因子> ::= <标识符> | <数组> | <无符号整数> | '(' <表达式> ')'
<加法运算符> ::= + | -
<乘法运算符> ::= * | /
<关系运算符> ::= = | # | < | <= | > | >=
<字母> ::= a | b | …… | X | Y | Z
<数字> ::= 0 | l | 2 | …… | 8 | 9
*)
implementation
end.
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)