Lex和Yacc

Lex和Yacc的分工

Lex用于词法分析,Yacc用于语法分析,二者可以单独使用,亦可配合工作。Yacc和Lex都是基于C语言的,语法极其相似,功能上Yacc和Lex有部分重叠,但是二者有一点区别:Yacc不能表达数字[0-9]+,也不能获得相应的数值;Yacc还不能忽略空白和注释。而这两点恰恰Lex可以办到。通常,Lex用于数字、空格和注释的解析,Yacc用于表达式解析。

Lex模板

/* C 和 Lex 的全局声明 */
%%

/* 模式(C 代码) */
%%

/* C 函数 */ 

Yacc模板

%{  
    /* C声明 */
    #include <stdio.h>
%}
/* yacc 定义 */
%%
/* 输入及其对应的动作的C描述 */
%%
/* C 代码 */
int main(void) 
{
  return yyparse();
}
int yylex(void)
{
  return getchar();
}
void yyerror(char *s)
{
  fprintf(stderr, "%s\n", s);
}
%%

示例程序

Lex name.lex

%{
    #include "y.tab.h"
    #include <stdio.h>
    #include <string.h>
    extern char* yylval;
%}
char [A-Za-z]
num [0-9]
eq [=]
name {char}+
age {num}+
%%

{name} { yylval = strdup(yytext); return NAME; }
{eq} { return EQ; }
{age} { yylval = strdup(yytext); return AGE; }
%%

int yywrap()
{
    return 1;
}

Yacc name.y

%{
    #include <stdio.h>
    #define YYSTYPE char* /*a Yacc variable which has the value of returned token */
%}
%token NAME EQ AGE
%%

file: record file | record;
record: NAME EQ AGE
      {
         printf("%s is now %s years old!!1", $1, $3);
    };
%%

int main()
{
    yyparse();
    return 0;
}
int yyerror(char* msg)
{
    printf("Error: %s encountered \n", msg);
}

如何编译与运行

lex : .lex -> lex.yy.c
yacc : .y -> y.tab.c + y.tab.h
gcc : lex.yy.c + y.tab.h + lex.yy.cc -> a.out
a.out : input -> result
# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.2 (Maipo)
# lex name.lex
# yacc -d name.y
# cc lex.yy.c y.tab.h y.tab.c

# ./a.out
hello=3
hello is now 3 years old!!1

参考

[1] Yacc 与 Lex 快速入门
[2] Example of Formalising a Grammar for use with Lex & Yacc

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,027评论 19 139
  • 转载说明 一、介绍 浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工作原理,我们将看到,从你在地址栏输入g...
    17碎那年阅读 2,477评论 0 22
  • 简介浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工 作原理,我们将看到,从你在地址栏输入google.c...
    听风阁阅读 3,317评论 0 7
  • 目录一、介绍二、渲染引擎三、解析与DOM树构建四、渲染树构建五、布局六、绘制七、动态变化八、渲染引擎的线程九、CS...
    饥人谷_米弥轮阅读 2,473评论 0 10
  • 1. 介绍 浏览器可能是最广泛使用的软件。本书将介绍浏览器的工作原理。我们将看到,当你在地址栏中输入google....
    康斌阅读 2,070评论 7 18