⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tiger.grm

📁 针对“虎书”中的tiger语言写的语法分析器 根据书中对tiger语言的描述写了72条文法
💻 GRM
字号:
%{
#include <stdio.h>
#include "util.h"
#include "errormsg.h"

int yylex(void); /* function prototype */

void yyerror(char *s)
{
 EM_error(EM_tokPos, "%s", s);
}
%}


%union {
	int pos;
	int ival;
	string sval;
	}

%token <sval> ID STRING
%token <ival> INT

%token 
  COMMA COLON SEMICOLON LPAREN RPAREN LBRACK RBRACK 
  LBRACE RBRACE DOT 
  PLUS MINUS TIMES DIVIDE EQ NEQ LT LE GT GE
  AND OR ASSIGN
  ARRAY IF THEN ELSE WHILE FOR TO DO LET IN END OF 
  BREAK NIL
  FUNCTION VAR TYPE 

%start program

%left ELSE;
%left OR;
%left AND;
%nonassoc EQ,LT,LE,GT,GE,NEQ;
%left PLUS,MINUS;
%left TIMES,DIVIDE;
%left UMINUS;
%left LBRACK;
%%

program: ID
	| STRING
	| INT
	| NIL
	| lvalue
	| binary_operation_expr
	| assign_expr
	| function_expr
	| paren_expr
	| record_expr
	| ID LBRACK program RBRACK OF program
	| case_expr
	| WHILE program DO program
	| FOR ID ASSIGN program TO program DO program 
	| BREAK
	| scope_expr
	| LPAREN error RPAREN
	| error SEMICOLON program
	;
lvalue	: ID DOT ID
	| ID LBRACK program RBRACK
	| lvalue DOT ID
	| lvalue LBRACK program RBRACK
	;
binary_operation_expr	:
		  program OR program
		| program AND program
		| program EQ program
		| program LT program
		| program LE program
		| program GT program
		| program GE program
		| program NEQ program
		| program PLUS program
		| program MINUS program
		| program TIMES program
		| program DIVIDE program
		| MINUS program 	%prec UMINUS
		;
assign_expr 	: lvalue ASSIGN program
		| ID ASSIGN program
		;
function_expr	:
		  ID LPAREN RPAREN
		| ID LPAREN expr_list RPAREN
		;
expr_list 	: program
		| program COMMA expr_list 
		;
paren_expr 	: LPAREN RPAREN
		| LPAREN expr_seq RPAREN
		;
expr_seq 	: program
		| program SEMICOLON expr_seq
		;
record_expr 	: ID LBRACE RBRACE
		| ID LBRACE fieldexpr_list RBRACE
		;
fieldexpr_list: ID EQ program
		| ID EQ program COMMA fieldexpr_list
		;
case_expr 	: IF program THEN program
		| IF program THEN program ELSE program
		;
scope_expr 	: LET dec_list IN END
		| LET dec_list IN expr_seq END
		;
dec_list 	: dec
		| dec dec_list
		;
dec 		: type_dec
		| variable_dec
		| function_dec
		;
type_dec 	: TYPE ID EQ type
		;
type 		: ID
		| LBRACE RBRACE
		| LBRACE field_list RBRACE
		| ARRAY OF ID
		;
field_list 	: ID COLON ID
		| ID COLON ID COMMA field_list
		;
variable_dec 	: VAR ID ASSIGN program
		| VAR ID COLON ID ASSIGN program
		;
function_dec 	: FUNCTION ID LPAREN RPAREN EQ program
		| FUNCTION ID LPAREN RPAREN COLON ID EQ program
		| FUNCTION ID LPAREN field_list RPAREN EQ program
		| FUNCTION ID LPAREN field_list RPAREN COLON ID EQ program

⌨️ 快捷键说明

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