📅  最后修改于: 2023-12-03 15:06:05.661000             🧑  作者: Mango
YACC程序是一种针对自动将输入文本解析为语法结构或语法树的语言的编译器生成器。本例中,我们编写的YACC程序可以接受以0或1开头和结尾的字符串。以下是代码片段和详细介绍。
%{
#include<stdio.h>
#include<string.h>
int yylex();
void yyerror(char *);
char input[ysize];
%}
%token ONE ZERO
%start input
%%
input : ONE expression ONE
| ZERO expression ZERO
;
expression: expression ONE
| expression ZERO
| ONE
| ZERO
;
%%
void yyerror(char* s)
{
printf("%s\n",s);
}
int yylex()
{
static int i=-1;
i++;
if(input[i]=='\0'){
return 0;
}else if(input[i]=='0'){
return ZERO;
}else{
return ONE;
}
}
int main()
{
printf("Enter input string: ");
gets(input);
yyparse();
return 0;
}
%{...%}
包括了程序段#include<stdio.h>
,用于输入输出)以及全局变量(char input[ysize]
,用于保存输入字符串)。%token ONE ZERO
声明了两个终端符号(ONE
和ZERO
)。%start input
规定了起始符号为input
。input
和expression
是两个非终端符号。input
可以由以0
或1
开头和结尾的字符串构成。其中,expression
是可重复的。expression
是一个递归的非终端符号,表示该语法的重点在于各项之间的相互关系。一般情况下,语法分析程序对句子的逐项解析即可,但基于某些语言或文化的特殊性,这个表示关系的重点可能会发生变化。yyerror
函数打印错误信息。yylex
函数根据输入的字符流返回终端符号。static int i=-1;
表示从0开始遍历字符串。main
函数获取输入字符串并调用yyparse()
开始解析。gets(input)
获取输入字符串。iyparse()
调用开始语法分析。本文介绍了如何用YACC编写一个可以接受以0或1开头和结尾的字符串的程序。该程序基于一些比较基本的语法分析功能,为初学者理解编译原理的相关概念和理论提供了实践的机会。同时,也值得注意的是,复杂的语法分析需要具备更加深入的计算机科学知识和编程技能,因此,需要在深入掌握基本知识之后再进一步扩展和优化。