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

📄 2.y

📁 打开2.tab.c编译运行
💻 Y
字号:
%{
#include<stdio.h>
#include<string.h>
#include"lex.yy.c"
%}

%token IF THEN WHILE DO READ WRITE CALL BEGIN END CONST VAR PROCEDURE ODD
%token ADD MINUS MULTIPLY DIVIDE EQUAL UNEQUAL LESS LESSEQUAL MORE MOREEQUAL EVALUATE
%token LPARENTHESES RPARENTHESES COMMA SEMICOLON DOT 
%token NOSIGNINTEGER IDENT 

%%
/* <程序> ::= <分程序>. */
Program		:	PartialProgram DOT {printf("<程序> --> <分程序>.\n");}
			;

/* <分程序> ::= [<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句> */
PartialProgram		:ConstantDeclaration VariableDeclaration ProcedureDeclaration Statement
						{printf("<分程序> --> <常量说明部分><变量说明部分><过程说明部分><语句>\n");}
					 |VariableDeclaration ProcedureDeclaration Statement
						{printf("<分程序> --> <变量说明部分><过程说明部分><语句>\n");}
					 |ConstantDeclaration ProcedureDeclaration Statement
						{printf("<分程序> --> <常量说明部分><过程说明部分><语句>\n");}
					 |ConstantDeclaration VariableDeclaration Statement
						{printf("<分程序> --> <常量说明部分><变量说明部分><语句>\n");}
					 |ConstantDeclaration Statement
						{printf("<分程序> --> <常量说明部分><语句>\n");}
					 |VariableDeclaration Statement
						{printf("<分程序> --> <变量说明部分><语句>\n");}
					 |ProcedureDeclaration Statement
						{printf("<分程序> --> <过程说明部分><语句>\n");}
					 |Statement
						{printf("<分程序> --> <语句>\n");}
					 ;

/* <常量说明部分> ::= CONST<常量定义>{,<常量定义>}; */
ConstantDeclaration	:CONST ConstList SEMICOLON
						{printf("<常量说明部分> --> CONST <常量定义序列>;\n");}
					 ;

/* <常量定义序列> ::= <常量定义>|<常量定义序列>,<常量定义> */
ConstList			:ConstDefination
						{printf("<常量定义序列> --> <常量定义>\n");}
					 |ConstList COMMA ConstDefination
						{printf("<常量定义序列> --> <常量定义序列>,<常量定义>\n");}
					 ;

/* <常量定义> ::= <标识符>:=<无符号整数> */
ConstDefination		:IDENT EVALUATE NOSIGNINTEGER
						{printf("<常量定义> --> <标识符>:=<无符号整数>\n");}
					 ;

/* <变量说明部分> ::= VAR<标识符>{,<标识符>}; */
VariableDeclaration	:VAR IdentList SEMICOLON
						{printf("<变量说明部分> --> VAR <标识符序列>;\n");}
					 ;

/*<标识符序列> ::= <标识符>|<标识符序列>,<标识符> */
IdentList			:IDENT
						{printf("<标识符序列> --> <标识符>\n");}
					 |IdentList COMMA IDENT
						{printf("<标识符序列> --> <标识符序列>,<标识符>\n");}
					 ;

/* <过程说明部分> ::= <过程首部><分程序>{;<过程说明部分>}; */
ProcedureDeclaration :ProcedureHead PartialProgram SEMICOLON ProcedureDeclaration SEMICOLON
                     {printf("<过程说明部分>--><过首部><分程序>;<过程说明部分>;");}
                     |ProcedureHead PartialProgram SEMICOLON {printf("<过程说明部分>--><过程首部><分程序>;\n");}
                     ;

/* <过程首部> ::= PROCEDURE<标识符>; */
ProcedureHead		:PROCEDURE IDENT SEMICOLON
					 {printf("<过程首部> --> PROCEDURE<标识符>;\n");}
					 ;

/* <语句> ::= <赋值语句>|<复合语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<空> */
Statement	:EvaluateStatement
				{printf("<语句> --> <赋值语句>\n");}
			 |ComplexStatement
				{printf("<语句> --> <复合语句>\n");}
			 |ConditionStatement
				{printf("<语句> --> <条件语句>\n");}
			 |WhileStatement
				{printf("<语句> --> <当型循环语句>\n");}
			 |ProcedureCallStatement
				{printf("<语句> --> <过程调用语句>\n");}
			 |ReadStatement
				{printf("<语句> --> <读语句>\n");}
			 |WriteStatement
				{printf("<语句> --> <写语句>\n");}
			 |
				{printf("<语句> --> <空>\n");}
			 ;

/*<赋值语句> ::= <标识符>:=<表达式> */
EvaluateStatement	:IDENT EVALUATE Expression 
					 {printf("<赋值语句> --> <标识符>:=<表达式>\n");}
					 ;

/* <复合语句> ::= BEGIN<语句>{;<语句>}END */
ComplexStatement	:BEGIN StatementList END
						{printf("<复合语句> --> BEGIN<语句序列>END\n");}
					 ;

/* <语句序列> ::= <语句>|<语句序列>;<语句> */
StatementList	:Statement
					{printf("<语句序列> --> <语句>\n");}
				 |StatementList SEMICOLON Statement
					{printf("<语句序列> --> <语句序列>;<语句>\n");}
				 ;

/* <条件> ::= <表达式><关系运算符><表达式>|ODD<表达式> */
Condition	:Expression RelationOperator Expression
				{printf("<条件> --> <表达式><关系运算符><表达式>\n");}
			 |ODD Expression
				{printf("<条件> --> ODD<表达式>\n");}
			 ;

/* <条件语句> ::= IF<条件>THEN<语句> */
ConditionStatement	:IF Condition THEN Statement
						{printf("<条件语句> --> IF<条件>THEN<语句>\n");}
					 ;

/* <表达式> ::= [+|-]<项>{<加法运算符><项>} */
Expression	:ADD TermList
				{printf("<表达式> --> +<项序列>\n");}
			|MINUS TermList
				{printf("<表达式> --> -<项序列>\n");}
			|TermList
				{printf("<表达式> --> <项序列>\n");}
			;

/* <项序列> ::= <项>|<项序列><加法运算符><项> */
TermList	:Term
				{printf("<项序列> --> <项>\n");}
			 |TermList ADD Term
				{printf("<项序列> --> <项序列>+<项>\n");}
			 |TermList MINUS Term
				{printf("<项序列> --> <项序列>-<项>\n");}
			 ;

/* <项> ::= <因子>{<乘法运算符><因子>} */
Term	:GeneList
			{printf("<项> --> <因子序列>\n");}
		 ;

/* <因子序列> ::= <因子>|<因子序列><乘法运算符><因子> */
GeneList	:Gene
				{printf("<因子序列> --> <因子>\n");}
			 |GeneList MULTIPLY Gene
				{printf("<因子序列> --> <因子序列>*<因子>\n");}
			 |GeneList DIVIDE Gene
				{printf("<因子序列> --> <因子序列>/<因子>\n");}
			 ;

/* <因子> ::= <标识符>|<无符号整数>|'('<表达式>')' */
Gene	:IDENT
			{printf("<因子> --> <标识符>\n");}
		 |NOSIGNINTEGER
			{printf("<因子> --> <无符号整数>\n");}
		 |LPARENTHESES Expression RPARENTHESES
			{printf("<因子> --> '('<表达式>')'\n");}
		 ;

/* <关系运算符> ::= =|#|<|<=|>|>= */
RelationOperator	:EQUAL
						{printf("<关系运算符> --> =\n");}
					 |UNEQUAL
						{printf("<关系运算符> --> #\n");}
					 |LESS
						{printf("<关系运算符> --> <\n");}
					 |LESSEQUAL
						{printf("<关系运算符> --> <=\n");}
					 |MORE
						{printf("<关系运算符> --> >\n");}
					 |MOREEQUAL
						{printf("<关系运算符> --> >=\n");}
					 ;

/* <当型循环语句> ::= WHILE<条件>DO<语句> */
WhileStatement	:WHILE Condition DO Statement
					{printf("<当型循环语句> --> WHILE<条件>DO<语句>\n");}
				 ;

/* <过程调用语句> ::= CALL<标识符> */
ProcedureCallStatement	:CALL IDENT
							{printf("<过程调用语句> --> CALL<标识符>\n");}
						 ;

/* <读语句> ::= READ'('<标识符>{,<标识符>}')' */
ReadStatement	:READ LPARENTHESES IdentList RPARENTHESES
					{printf("<读语句> --> READ(<标识符序列>)\n");}
				 ;

/* <写语句> ::= WRITE'('<表达式>{,<表达式>}')' */
WriteStatement	:WRITE LPARENTHESES ExpressionList RPARENTHESES
					 {printf("<写语句> --> WRITE(<表达式序列>)\n");}
				 ;

/* <表达式序列> ::= <表达式>|<表达式序列>,<表达式> */
ExpressionList	:Expression
					{printf("<表达式序列> --> <表达式>\n");}
				 |ExpressionList COMMA Expression
					{printf("<表达式序列> --> <表达式序列>,<表达式>\n");}
				 ;
%%

int main()
{
	char filename[20];
	printf("请输入要打开的文件名:");
	scanf("%s",filename);
	yyin=fopen(filename,"r");
	if(!yyin)
	{
		printf("\n对不起,不能打开文件.\n");
		return 0;
	}
	yyparse();
    fclose(yyin);
    return 0;
}

yyerror(char *s)
{
    printf("Error!\n");
}


    

⌨️ 快捷键说明

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