• lex&yacc


    LEX:

    yytext 数组包含匹配模式的文本;

    使词法分析程序工作的两条规则是:
    1. lex 模式只匹配输入字符或字符串一次。
    2. lex 执行当前输入的最长可能匹配的动作。

    由 lex 产生的词法分析程序是一个称为 yylex()的 C 例程,我们可以调用它.

    main()和 yyerror(),这组函数是使用 lex 生成的词法分析程序进行编译时所必需的.

    lex 词法分析程序从标准I/O 文件 yyin 中读取输入,所以当需要时,只需要改变 yyin。yyin 的默认值是stdin,

    因为默认输入源是标准输入。当 yylex()到达输入文件的尾端时,它调用 yywrap(),该函数返回数值 0 或 1。如
    果值为 1,那么程序完成而且没有输入。换句话说,如果值为 0,那么词法分析程序假设 yywrap()已经打开了它要读取

    的另一个文件,而且继续读取 yyin。默认的 yywrap()总是返回 1。

    % lex ch1-02.l
    % cc lex.yy.c –o first –ll

    词法分析程序与语法分析程序的通信

    当一起使用 lex 扫描程序和 yacc 语法分析程序时,语法分析程序(parser)(yyparse)是较
    高级别的例程。当它需要来自输入的标记时,就调用词法分析程序 yylex()。然
    后,词法分析程序从头到尾扫描输入识别标记。它一找到对语法分析程序有意义
    的标记就返回到语法分析程序,将返回标记的代码作为 yylex()的值。

    最重要的子程序是 main(),这个子程序重复调用 yyparse()直到词法分析程
    序的输入文件结束。例程 yyparse()是由 yacc 生成的语法分析程序.
    lex ch1-n.l
    yacc –d ch1-m.y
    cc –c lex.yy.c y.tab.c
    cc –o example-m.n lex.yy.o y.tab.o -ll

    =================================================================

    1. lex使具有起始状态的规则跟在一个没有起始状态的规则之后

      .+     ECHO;
      <MAGIC>.+ { BEGIN 0; printf("Magic:"); ECHO; }

    可以将没有起始状态的规则隐式地认为具有一个“通配符”起始状态,它们匹配
    所有的起始状态。这常常是错误的根源。flex 和 lex 的其他新版本都有“惟一的
    起始状态”,可以解决通配符问题。参见第七章的“起始状态”一节可以得到更多的详细资料。

    2.yacc 语法分析程序调用 yyerror()(它在用户的子程序段提供),然后识别特殊的规则 error。

    3.yacc无论词法分析程序何时将标记返回给语法分析程序,如果标记有相关的值,词法
    分析程序在返回之前都必须在 yylval 中存储值。

  • 相关阅读:
    java 基于服务做统一数据导出
    canvas实行五星红旗盖章
    linux 端口操作
    windows mysql 连接
    C++ 保留有效位数 和 保留小数位数
    C++ cv::Mat数据类型 + 提取某些行或列
    element中table的表格更新数据之后保留原来的勾选状态
    js 下载网络文件到本地,根据url下载文件,下载本地文件
    QML与C++ 集成概览
    Qt中qDebug不能输出的解决
  • 原文地址:https://www.cnblogs.com/orchid-sky/p/3635374.html
Copyright © 2020-2023  润新知