tiger.grm

来自「针对“虎书”中的tiger语言写的语法分析器 根据书中对tiger语言的描述写」· GRM 代码 · 共 135 行

GRM
135
字号
%{
#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 + =
减小字号Ctrl + -
显示快捷键?