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