syntax.h

来自「现代编译原理C语言实现中的第二章的编译器实现。并在书中的基础上有所改变。包括词法」· C头文件 代码 · 共 96 行

H
96
字号
#pragma once

#include "common.h"
#include "Lex.h"
#include "Semantic.h"


class Syntax
{
public:
	Syntax(void);
	~Syntax(void);
};
/*
<program>		-> begin <statement list> end
<statementlist> -> <statement { <statement> }
<statement>		-> <ID> := <expression>;
<statement>		-> <read( <id list> );
<statement>		-> <write>( <expr list> );
<id list>		-> ID {, ID}
<expr list>		-> <expression> {, <expression>}
<expression>	-> <primary> { <add op> <primary> }
<primary>		-> <expression>
<primary>		-> ID
<primary>		-> INTLITERAL
<primary>		-> PLUSOP
<primary>		-> MINUSOP
<add op>		-> PLUSOP
<add op>		-> MINUSOP
<system goal>	-> <program> SCANEOF
带语义处理的表示: #xxxx表示对应的处理函数
<program>		-> #start  begin <statement list> end
<statementlist> -> <statement { <statement> }
<statement>		-> <ident> := <expression>  #assign ;
<statement>		-> read  ( <id list> );
<statement>		-> write ( <expr list> );
<id list>		-> <ident>  #read_id  {, <ident>  #read_id  }
<expr list>		-> <expression>  #write_expr  {, <expression>  #write_expr  }
<expression>	-> <primary> { <add op> <primary>  #gen_infix  }
<primary>		-> ( <expression> )
<primary>		-> <ident>
<primary>		-> INTLITERAL #process_literal
<add op>		-> PLUSOP     #process_op
<add op>		-> MINUSOP    #process_op
<ident>			-> ID         #process_id
<system goal>	-> <program> SCANEOF #finish

进行语法扩展
<system goal>      -> <program> SCANEOF #finish
<program>          -> #start  <function> {, <function> }
<function>         -> function <fname>  ( <param list> ) begin <statement list> end
<function>         -> function <fname>  (              ) begin <statement list> end
<statementlist>    -> <statement> { <statement> }
<statement>        -> <ident> := <expression>  #assign ;
<statement>        -> read( <read list> );
<statement>        -> write ( <write list> );
<statement>        -> <ident> ( <argument list> ) #process_func_call;
<statement>        -> <ident> (                 ) #process_func_call;
<param list>       -> <ident> #process_param {, <ident> #process_param }
<argument list>    -> <ident> #process_argu {, <ident> #process_argu }
<read list>        -> <ident>  #read_id  {, <ident>  #read_id  }
<write list>       -> <expression>  #write_expr  {, <expression>  #write_expr  }
<expression>       -> <mul expr> { <add op> <mul expr>  #gen_infix  }
<mul expr>         -> <primary> { <mul op> <primary> }
<primary>          -> ( <expression> )
<primary>          -> <ident>
<primary>          -> INTLITERAL #process_literal
<add op>           -> PLUSOP     #process_op
<add op>           -> MINUSOP    #process_op
<mul op>           -> MULOP      #process_op
<mul op>           -> DIVOP      #process_op
<ident>            -> ID         #process_id
<fname>			   -> ID         #gen_func_name
*/
void		system_goal		(void);
void		program			(void);
void		function		(void);// new added
void		statement_list	(void);
void		statement		(void);
void		param_list		(void);// new added
void		argument_list	(void);// new added
void		read_list		(void);// id_list
void		write_list		(void);// expr_list
void		expression		(expr_rec *);
void		mul_expr		(expr_rec *);// new added
void		primary			(expr_rec *);
void		add_op			(op_rec   *);
void		mul_op			(op_rec   *);
void		ident			(expr_rec *);
void		fname			(expr_rec *);// new added

token next_token();
void  match(token);

void syntax_error(token);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?