资源简介

编译原理实验四--语法分析程序。参照TINY语言的语法分析程序,完成了对C-语言的语法分析

资源截图

代码片段和文件信息

#include
#include 
#include 
#include 

#define MAXRESERVED 6 //关键字最大程度 
#define MAXTOKENLEN 40 //标识符最大长度 
#define BUFLEN 256
#define TRUE 1
#define FALSE 0
static char lineBuf[BUFLEN]; /*读取一行字符保存 */
static int linepos = 0; /* 指示缓存中第几个字符 */
static int bufsize = 0; /* 当前缓存中字符串长度 */
static int EOF_flag = FALSE; /* 错误标识 */

/* allocate global variables */
int lineno = 0;
FILE * source; //读入文件 
FILE * listing; //output file 
//FILE * code;
/* allocate and set tracing flags */
int EchoSource = TRUE;
int TraceScan = TRUE;
int TraceParse = TRUE;
int TraceAnalyze = FALSE;
int TraceCode = FALSE;
int Error = FALSE;


static void syntaxError(char * message) 
{  
 fprintf(listing“\n>>> “); 
 fprintf(listing“Syntax error at line %d: %s“linenomessage); 
  Error = TRUE; 

typedef enum //枚举类型,保存词素类型
    /* book-keeping tokens */
   {ENDFILEERROR
    /* reserved words */
    IFELSEINTRETURNVOIDWHILE
    /* multicharacter tokens */
    IDNUM
    /* special symbols */
    LBRKRBRKLBRACERBRACEGTELTENEQEQASSIGNLTGTPLUSMINUSTIMESOVERLPARENRPARENSEMICOMMA
   } TokenType;
static TokenType token; /* holds current token */
static struct //关键字字结构,方便查询 
    { char* str;
      TokenType tok;
    } reservedWords[MAXRESERVED]
   = {{“if“IF}{“int“INT}{“else“ELSE}{“return“RETURN}
      {“void“VOID}{“while“WHILE}};
typedef enum //枚举类型,保存状态
   { STARTINRCOMINLCOMINCOMMENTINNUMINIDDONEINLTEINGTEINEEQINNEQ}
   StateType;
char tokenString[MAXTOKENLEN+1]; //保存标识符

//节点类型 
typedef enum {IntK IdK VoidK ConstK Var_DeclK Arry_DeclK FunK ParamsK  
ParamK CompK Selection_StmtK Iteration_StmtK Return_StmtK AssignK OpK  
Arry_ElemK CallK ArgsK UnkownK} NodeKind; 
//表达式类型 
typedef enum {VoidInteger} ExpType; 

   
//const int max_child = 4; 
//treeNode定义 包括子节点、兄弟节点、所处行号、节点类型、属性、表达式返回类型 
typedef struct treeNode 

struct treeNode *  child[4]; 
struct treeNode *  sibling; 
int lineno; 
NodeKind nodekind; 
//union {StmtKind stmtExpT }; 
union { TokenType op; int val; const char * name;} attr; 
ExpType type; 
} TreeNode; 
TreeNode * parse(void); 
TreeNode * declaration_list(void); 
TreeNode * declaration(void); 
TreeNode * params(void); 
TreeNode * param_list(TreeNode * k); 
TreeNode * param(TreeNode * k); 
TreeNode * compound_stmt(void); 
TreeNode * local_declaration(void); 
TreeNode * statement_list(void); 
TreeNode * statement(void);  
TreeNode * expression_stmt(void); 
TreeNode * selection_stmt(void); 
TreeNode * iteration_stmt(void); 
TreeNode * return_stmt(void); 
TreeNode * expression(void); 
TreeNode * var(void); 
TreeNode * simple_expression(TreeNode * k); 
TreeNode * additive_expression(TreeNode * k); 
TreeNode * term(TreeNode * k); 
TreeNode * factor(TreeNode * k);  
TreeNode * call(TreeNode * k); 
TreeNode * args(void); 

static int getNextChar(void)//获取缓存中下一个字符
{ if 

评论

共有 条评论