我是靠谱客的博主 落寞秋天,最近开发中收集的这篇文章主要介绍Lex和Yacc的入门lex和yacc简介lex使用yacc使用实例应用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  • lex和yacc简介
  • lex使用
  • yacc使用
  • 实例应用


lex和yacc简介

lex和yacc是自动编译C代码的工具,适合于解析简单语言.这些工具常用于编译器或者解释器的组成部分,或者用于读取配置文件.“lex”和“yacc”这两个名字所代表的也包括这些工具的 GNU 版本 flex 和 bison. lex 和 yacc 是一对配对工具。lex 将文件分解为成组的“记号(tokens)”,大体上类似于单词。yacc 接受 成组的记号,并将它们装配为高层次的结构,类似于句子。yacc 设计用来处理 lex 的输出,不过您也可以 编写自己的代码来完成此任务。同样,lex 的输出很大程度上设计用于为某类解析器提供数据。

lex使用

Lex语法分析

yacc使用

实例应用

使用的是linux系统下的flex和bison,它们是lex和yacc的加强版.
calculator.l的源码

%{
#include <stdio.h>

#include "y.tab.h"

int
yywrap(void)
{
return 1;
}
%}
%%
"+"
return ADD;
"-"
return SUB;
"*"
return MUL;
"/"
return DIV;
"n"
return CR;
([1-9][0-9]*)|0|([0-9]+.[0-9]*) {
double temp;
sscanf(yytext, "%lf", &temp);
yylval.double_value = temp;
return DOUBLE_LITERAL;
}
[ t] ;
. {
fprintf(stderr, "lexical error.n");
exit(1);
}
%%

calculator.y源码

%{
#include<stdio.h>

#include<stdlib.h>

#define YYDEBUG 1

%}
%union {
int int_value;
double double_value;
}
%token <double_value> DOUBLE_LITERAL
%token ADD SUB MUL DIV CR
%type <double_value> expression term primary_expression
%%
line_list
: line
| line_list line
;
line
: expression CR
{
printf(">>%lfn",$1);
}
expression
: term
| expression ADD term
{
$$=$1+$3;
}
| expression SUB term
{
$$=$1-$3;
}
;
term
: primary_expression
| term MUL primary_expression
{
$$=$1*$3;
}
| term DIV primary_expression
{
$$=$1/$3;
}
;
primary_expression
: DOUBLE_LITERAL
;
%%
int
yyerror(char const *str)
{
extern char *yytext;
fprintf(stderr,"parser error near %sn",yytext);
return 0;
}
int main(void)
{
extern int yyparse(void);
extern FILE *yyin;
yyin=stdin;
if(yyparse()){
fprintf(stderr,"Error! Error! Error!n");
exit(1);
}
}
操作命令
$bison -ydv calculator.y
$flex calculator.l
$gcc -o calc y.tab.c lex.yy.c

最后

以上就是落寞秋天为你收集整理的Lex和Yacc的入门lex和yacc简介lex使用yacc使用实例应用的全部内容,希望文章能够帮你解决Lex和Yacc的入门lex和yacc简介lex使用yacc使用实例应用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部