📄 tiger.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 + -