首页 > 其他分享 >Flex&Bison

Flex&Bison

时间:2024-01-13 18:23:05浏览次数:30  
标签:Flex return yytext int %% Bison printf

Flex与 Bison

《Flex与 Bison》阅读笔记

Flex 和 Bison 简介

第一个 flex 程序

%{
    int chars = 0;
    int words = 0;
    int lines = 0;
%}

%%
[^ \t\n\r\f\v]+   { words++; chars += strlen(yytext); }
\n    { chars++; lines++; }
.    { chars++; }
%%

int main(int argc, char **argv)
{
    yylex();
    printf("%8d%8d%8d\n", lines, words, chars);
}

纯 Flex 的程序

/* 英式英语 -> 美式英语 */
%%
"colour" { printf("color"); }
"flavour" { printf("flavor"); }
"clever" { printf("smart"); }
"conservative" { printf("liberal"); }
. { printf("%s",yytext); }
%%

Flex 与 Bison 协同工作

%%
"+"    { printf("PLUS\n"); }
"-"    { printf("MINUS\n"); }
"*"    { printf("TIMES\n"); }
"/"    { printf("DIVIDE\n"); }
"|"    { printf("ABS\n"); }
[0-9]+ { printf("NUMBER %s\n", yytext); }
\n     { printf("NEWLINE\n"); }
[\t]   { }
.      { printf("Mystery character %s\n", yytext); } //其他模式所没有匹配的内容
%%

计算器词法分析器

%{
    enum yytokentype {
        NUMBER = 258,
        ADD = 259,
        SUB = 260,
        MUL = 261,
        DIV = 262,
        ABS = 263,
        EOL = 264
    };
    int yylval;
%}

%%

"+"         { return ADD; }
"-"         { return SUB; }
"*"         { return MUL; }
"/"         { return DIV; }
"|"         { return ABS; }
[0-9]+      { yylval = atoi(yytext); return NUMBER; }
\n          { return EOL; }
[\t]        { }
.           { printf("Mystery character %c\n", *yytext); }
%%

int main(int argc, char **argv)
{
    int tok;

    while (tok = yylex()) {
        printf("%d", tok);
        if (tok == NUMBER) printf(" = %d\n", yylval);
        else printf("\n");
    }
}

Bison 简单的计算器

%{
    #include <stdio.h>
    int main();
    void yyerror();
    int yylex();
%}

/* declare tokens */
%token NUMBER
%token ADD SUB MUL DIV ABS
%token EOL

%%

calclist: /* 空规则 */
    | calclist exp EOL { printf("= %d\n", $2); }
    ;

exp : factor         { $$ = $1; }
    | exp ADD factor { $$ = $1 + $3; }
    | exp SUB factor { $$ = $1 - $3; }
    ;

factor : term            { $$ = $1; }
       | factor MUL term { $$ = $1 * $3; }
       | factor DIV term { $$ = $1 / $3; }
       ;
term : NUMBER   { $$ = $1; }
     | ABS term { $$ =  $2 > 0 ? $2 : -$2; }
     ;

%%

int main(int argc, char ** argv)
{
    yyparse();
}
void yyerror(char *s)
{
    fprintf(stderr, "error: %s\n", s);
}

计算器的词法分析器

%{
    #include "fbl-5.tab.h"
%}

%%
"+"         { return ADD; }
"-"         { return SUB; }
"*"         { return MUL; }
"/"         { return DIV; }
"|"         { return ABS; }
[0-9]+      { yylval = atoi(yytext); return NUMBER; }
\n          { return EOL; }
[\t]        { }
.           { printf("Mystery character %c\n", *yytext); }

%%

标签:Flex,return,yytext,int,%%,Bison,printf
From: https://www.cnblogs.com/qwerty-ll/p/17962681

相关文章

  • 【LeetCode1747. 应该被禁止的 Leetflex 账户】MySQL用户变量编程;尝试维护一个multise
    题目地址https://leetcode.cn/problems/leetflex-banned-accounts/description/代码witht1as(selectaccount_id,ip_address,loginastick,"login"asmytypefromLogInfounionallselectaccount_id,ip_address,logoutastick......
  • vue使用flexible.js 最大宽度只有540
    分辨率大于540px的时候,flexible限制为540,一般的手机显示没有问题,但对于大于540的竖屏屏幕,可能右边就会留白。我想让横屏的时候限制在540,竖屏的时候根据页面实际宽度自适应,解决方法如下:1、安装npminstalllib-flexible--save 2、为了避免每次安装的时候,都被覆盖掉,打开\nod......
  • Flex布局解决最后一行左对齐
    使用flex布局,将多个元素以三个为一行,往下排列。.logo-field{width:650px;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;.__logo-item{width:200px;height:150px;margin-top:15px......
  • 登录界面(flex布局练习)
    练习:登录界面在我们网页制作的过程中经常遇见,所以请你编写一个界面联系一下,这个可以增加一些动画或者是其他的效果,当然越帅越好。请使用flex或者其他布局练习例如: 代码 <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content......
  • CSS flex布局(详解)
    前面我们学了很多基本的布局,现在我们将学习一种新的布局方式,这种布局方式更为常用,并且可以缩减很多不必要的代码。我们来看一个实际中的布局。代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,ini......
  • Node-js用FlexSearch给Hexo添加极速全站搜索
    title:Node.js用FlexSearch给Hexo添加极速全站搜索tags:[Node.js,node,Javascript,Debian,Linux,FlexSearch,搜索]新版原文:https://www.carlzeng.top/search?q=Node.js用FlexSearch给Hexo添加极速全站搜索版权声明:本博客所有文章除特别声明外,均采用BY-NC-SA许可协议。......
  • SpringBoot接入Mybatis-Flex
    相信不少的伙伴在日常开发中应该都用过MyBatis增强框架吧,目前来说国内用的比较多的无非就是MyBatis-Plus,那么今天我再给大家介绍一款新的MyBatis增强框架,它就是MyBatis-Flex。那么这个框架到底怎么样呢,跟MyBatis-Plus有什么不一样的呢,下面我们先来看下它的介绍,这是官网的一段介......
  • 弹性布局 flex 的公共的css文件
    /*弹性布局*/.flex{display:flex;}.flex1{flex:1;}.flex-column{flex-direction:column;}.justify-start{justify-content:flex-start;}.justify-end{justify-content:flex-end;}.justify-center{justify-content:center;}.justify-betw......
  • flex布局
    目录简介flex容器基本概念flex-direction:决定主轴的方向(即元素的排列方向)flex-wrap:指定弹性盒子的子元素换行方式justify-content:定义了元素在主轴的对齐方式align-items:设置弹性盒子元素在交叉轴(与主轴垂直)方向上的对齐方式align-content:用于修改flex-wrap属性的行为弹......
  • [CSS]flex弹性盒
    先来一个常用的flex样例。水平从左往右主轴,自动换行,从主轴起始位置开始分布(侧轴不设置,使用margin进行间隔):.tags{display:flex;justify-content:flex-start;flex-wrap:wrap;}.tag_item{margin:10px12px;}  Flex(弹性盒、伸缩盒)是CSS中的又一种布......