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

📄 test.y

📁 对pl0语言程序的语法分析源程序
💻 Y
字号:
%{
#include<stdio.h>
#include<string.h>
#include"lex.yy.c" 
%}

%token IF THEN WHILE DO READ WRITE CALL BEG END CONST VAR PROCEDURE ODD
%token CONCAT MINUS MULTI DIVIDE 
%token END_STMT OPEN_PAR CLOSE_PAR PAUSE DOT
%token ASSIGN DASSIGN JING SM_EQ BI_EQ SMALL BIG
%token ID NUM ERRORTOKEN

/*  YACC rules  */
%%
program
      : segment DOT {printf("程序->分程序.\n");}
      ;

segment
      : const_explain vari_explain proce_explain statement  {printf("分程序->常量说明部分 变量说明部分 过程说明部分 语句\n");}
      | const_explain vari_explain statement  {printf("分程序->常量说明部分 变量说明部分 语句\n");}
      | const_explain statement  {printf("分程序->常量说明部分 语句\n");}
      | const_explain proce_explain statement  {printf("分程序->常量说明部分 过程说明部分 语句\n");}
      | vari_explain proce_explain statement  {printf("分程序->变量说明部分 过程说明部分 语句\n");}
      | vari_explain statement  {printf("分程序->变量说明部分 语句\n");}
      | proce_explain statement  {printf("分程序->过程说明部分 语句\n");}
      | statement  {printf("分程序->语句\n");}
      ;

const_explain
      : CONST const_defi const_defi_list  END_STMT     {printf("常量说明部分->CONST 常量定义 常量定义串 ;\n");}
      | CONST const_defi END_STMT       {printf("常量说明部分->CONST 常量定义 ;\n");}
      ;

const_defi_list
      : const_defi_list PAUSE const_defi    {printf("常量定义串->常量定义串,常量定义\n");}
      | PAUSE const_defi    {printf("常量定义串->,常量定义\n");}
      ;

const_defi
      : ID DASSIGN NUM {printf("常量定义->ID := NUM\n");}
      ;

vari_explain
      : VAR ID ID_list END_STMT  {printf("变量说明部分->VAR ID 标识符串 ;\n");}
      | VAR ID END_STMT  {printf("变量说明部分->VAR ID ;\n");} 
      ;

ID_list
      : PAUSE ID {printf("标识符串->, ID\n");}
      | ID_list PAUSE ID  {printf("标识符串->标识符串 , ID\n");}
      ;

proce_explain
      : proce_head segment pro_explain_list END_STMT {printf("过程说明部分->过程首部 分程序 过程说明串 ;\n");}
      | proce_head segment END_STMT  {printf("过程说明部分->过程首部 分程序 ;\n");}
      ;

pro_explain_list
      : END_STMT proce_explain  {printf("过程说明串->; 过程说明部分\n");}
      | pro_explain_list END_STMT proce_explain  {printf("过程说明串->过程说明串 ; 过程说明部分\n");}
      ;

proce_head
      : PROCEDURE ID END_STMT  {printf("过程首部->PROCEDURE ID ;\n");}
      ;

statement
      : assign_statement  {printf("语句->赋值语句\n");}
      | compound_statement  {printf("语句->符合语句\n");}
      | if_statement  {printf("语句->条件语句\n");}
      | while_statement  {printf("语句->当型循环语句\n");}
      | pro_statement  {printf("语句->过程调用语句\n");}
      | read_statement  {printf("语句->读语句\n");}
      | write_statement  {printf("语句->写语句\n");}
      |          {printf("语句->空\n");}
      ;

assign_statement
      : ID DASSIGN expression  {printf("赋值语句->ID := 表达式\n");}
      ;

compound_statement
      : BEG statement statement_list END   {printf("复合语句->BEGIN 语句 语句串 END\n");}
      | BEG statement END  {printf("复合语句->BEGIN 语句 END\n");}
      ;

statement_list
      : END_STMT statement {printf("语句串->; 语句\n");}
      | statement_list END_STMT statement {printf("语句串->语句串 ; 语句\n");}
      ;

condition
      : expression relation_op expression {printf("条件->表达式 关系运算符 表达式\n");}
      | ODD expression {printf("条件->ODD 表达式\n");}
      ;

if_statement
      : IF condition THEN statement  {printf("条件语句->IF 条件 THEN 语句\n");}
      ;

expression
      : CONCAT term con_term_list {printf("表达式->+ 项 加法和项的串\n");}
      | MINUS term con_term_list {printf("表达式->- 项 加法和项的串\n");}
      | term con_term_list  {printf("表达式->项 加法和项的串\n");}
      | term  {printf("表达式->项\n");}
      | CONCAT term {printf("表达式->+ 项\n");}
      | MINUS term  {printf("表达式->- 项\n");}
      ;

con_term_list
      : con_term_list con_op term  {printf("加法和项的串->加法和项的串 加法运算符 项\n");}
      | con_op term  {printf("加法和项的串->加法运算符 项\n");}
      ;

term
      : elem mul_op_elem_list {printf("项->因子 乘法运算符和因子的串\n");}
      | elem  {printf("项->因子\n");}
      ;

mul_op_elem_list
      : mul_op_elem_list mul_op elem  {printf("乘法运算符和因子的串->乘法运算符和因子的串 乘法运算符 因子\n");}
      | mul_op elem {printf("乘法运算符和因子的串->乘法运算符 因子\n");}
      ;

elem
      : ID  {printf("因子->ID\n");}
      | NUM  {printf("因子->NUM\n");}
      | OPEN_PAR expression CLOSE_PAR  {printf("因子->( 表达式 )\n");}
      ;

con_op
      : CONCAT  {printf("加法运算符->+\n");}
      | MINUS   {printf("加法运算符->-\n");}
      ;

mul_op
      : MULTI   {printf("乘法运算符->*\n");}
      | DIVIDE    {printf("乘法运算符->/\n");}
      ;

relation_op
      : ASSIGN {printf("关系运算符->=\n");}
      | JING   {printf("关系运算符->#\n");}
      | SMALL  {printf("关系运算符-><\n");}
      | BIG    {printf("关系运算符->>\n");}
      | SM_EQ  {printf("关系运算符-><=\n");}
      | BI_EQ  {printf("关系运算符->>=\n");}
      ;

while_statement
      : WHILE condition DO statement {printf("当型循环语句->WHILE 条件 DO 语句\n");}
      ;

pro_statement
      : CALL ID  {printf("过程条用语句->CALL ID\n");}
      ;

read_statement
      : READ OPEN_PAR ID ID_list CLOSE_PAR  {printf("读语句->READ ( ID 标识符串 )\n");}
      | READ OPEN_PAR ID CLOSE_PAR   {printf("读语句->READ ( ID )\n");}
      ;

write_statement
      : WRITE OPEN_PAR expression expression_list CLOSE_PAR  {printf("写语句->WRITE ( 表达式 表达式串 )\n");}
      | WRITE OPEN_PAR expression CLOSE_PAR  {printf("写语句->WRITE ( 表达式 )\n");}
      ;

expression_list
      : expression_list PAUSE expression  {printf("表达式串->表达式串 , 表达式\n");}
      | PAUSE expression  {printf("表达式串->, 表达式\n");}
      ;

%%

int main()
{
    FILE * fp;
    char FILENAME[30];
    printf("********************************************************************************");
    printf("\t\t    A lex & yacc analyzer for PL0\nBy ZhaoYang No.50\n2004.11.15\n");
    printf("********************************************************************************\n\n");
    printf("Please enter the file name:\n");
    scanf("%s",FILENAME);
    if((fp=fopen(FILENAME,"r"))==NULL)
    { 
    	printf("Can not open the file!\n");
        return 1;
    }
    printf("\n----------------------------所有的终结符----------------------------------------\n");
    printf("IF THEN WHILE DO READ WRITE CALL BEG END CONST VAR PROCEDURE ODD + - * / ; ( ) , = := # <= >= < > ID NUM\n\n");
    printf("Start:\n");
	yyin=fp;
    yyparse();
    fclose(fp);
    printf("\n------------------------------规约成功------------------------------------------\n");
    return 0;
}

int yyerror(char * msg)
{
	printf("Error:%s at line number:%d\n",msg, yylineno);
        return 0;
}

    
    

⌨️ 快捷键说明

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