📌  相关文章
📜  YACC程序,该程序接受以0或1开头和结尾的字符串(1)

📅  最后修改于: 2023-12-03 15:06:05.661000             🧑  作者: Mango

YACC程序介绍-接受以0或1开头和结尾的字符串

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;
}
详细介绍
  1. %{...%}包括了程序段
  • 该程序段包含头文件(#include<stdio.h>,用于输入输出)以及全局变量(char input[ysize],用于保存输入字符串)。
  1. %token ONE ZERO声明了两个终端符号(ONEZERO)。
  2. %start input规定了起始符号为input
  3. inputexpression是两个非终端符号。
  • input可以由以01开头和结尾的字符串构成。其中,expression是可重复的。
  • expression是一个递归的非终端符号,表示该语法的重点在于各项之间的相互关系。一般情况下,语法分析程序对句子的逐项解析即可,但基于某些语言或文化的特殊性,这个表示关系的重点可能会发生变化。
  1. yyerror函数打印错误信息。
  • 当输入的字符串不满足语法要求时,该函数被激活,输出“syntax error”。
  1. yylex函数根据输入的字符流返回终端符号。
  • static int i=-1;表示从0开始遍历字符串。
  • 判断是否到达字符串末尾,返回0
  • 判断字符是1还是0,返回对应的终端符号。
  1. main函数获取输入字符串并调用yyparse()开始解析。
  • gets(input)获取输入字符串。
  • iyparse()调用开始语法分析。
总结

本文介绍了如何用YACC编写一个可以接受以0或1开头和结尾的字符串的程序。该程序基于一些比较基本的语法分析功能,为初学者理解编译原理的相关概念和理论提供了实践的机会。同时,也值得注意的是,复杂的语法分析需要具备更加深入的计算机科学知识和编程技能,因此,需要在深入掌握基本知识之后再进一步扩展和优化。