美文网首页
Flex & Bison 笔记

Flex & Bison 笔记

作者: longv2 | 来源:发表于2018-01-15 14:20 被阅读0次

    lex 文件结构

    lex 文件命名通常以 .l 结尾,共分为三个部分,由 %% 分割。

    声明部分
    %{
    会被原封不动拷贝到生成的文件中
    %}
    选项设置及预定义一些常用的模式

    %%
    规则定义部分,一个规则包含一个模式和一个动作
    REG {C 语言代码, return 一个 Token}
    其中 reg 是正则表达式模式,每读取的字符匹配了一个模式,就执行规则 {}里面的动作代码,返回一个 TOKEN。其中模式必须出现在行首,如果有俩个模式匹配,则选取其中最长的,也就是最长匹配原则

    规则定义部分,也可以包含一个 %{ C 代码 %} 块,其中的 C 代码会被执行一次,这通常可以用来返回一个 TOKEN,这个 TOKEN 会加在所有的 TOKEN 之前
    %%
    子例程,也就是 C 语言的 函数定义,会被拷贝到生成的此法额分析器 C 代码中

    Flex

    三层输入

    1. 默认使用标准输入或者yyin文件句柄读取,yyrestart() 重置输入状态,用来读取多个输入文件。

    2. 创建并使用 YY_BUFFER_STATE 输入缓冲区

    3. #define YY_INPUT(buf, result, max_size)

      当词法分析器的输入缓冲区为空时,就会调用 YY_INPUT,buf 是缓存区,result 等于实际存放在缓冲区的字符大小,max_size 缓存区的最大值。定义部分就是要把字符串拷贝到 buf 中。YY_INPUT 一般用于输入来自于其他一些内容,而这些内容无法预先载入字符串缓冲区且无法支持标准输入输出。

    状态

    定义:%x,%s
    切换:BEGIN(S)

    Bison

    每次规约就会执行规则相关联的动作
    yyparse() 会调用yylex()获取记号,yyval 或得记号值。

    相关文章

      网友评论

          本文标题:Flex & Bison 笔记

          本文链接:https://www.haomeiwen.com/subject/vdbroxtx.html