【问题标题】:what is the use of tokens.h when I am programming a lexer?当我编写词法分析器时,tokens.h 有什么用?
【发布时间】:2009-07-31 15:24:27
【问题描述】:

我正在用 C 语言编写一个词法分析器,我在某处读到了有关头文件 tokens.h 的信息。它在那里吗?如果有,它的用途是什么?

【问题讨论】:

    标签: c bison flex-lexer lexical-analysis


    【解决方案1】:

    tokens.h 是由yaccbison 生成的文件,其中包含语法中的标记列表。

    您的yacc/bison 输入文件可能包含以下令牌声明:

    %token INTEGER
    %token ID
    %token STRING
    %token SPACE
    

    通过yacc/bison 运行此文件将生成一个包含这些标记的预处理器定义的tokens.h 文件:

    /* Something like this... */
    #define INTEGER (1)
    #define ID      (2)
    #define STRING  (3)
    

    【讨论】:

    • 那么我应该如何使用它?..你有任何链接吗?
    • 不,我不是。我正在编写自己的 lex。你能推荐一些关于它的书吗?
    • 什么时候改变的?最后我使用它们,yacc 输出 y.tab.c 和 y.tab.h 文件。 Bison 将“y”替换为源文件的基本名称。
    • @mekasperasky,yacc(和 bison,它是 yacc 的 GNU 重写)是解析器生成器。如果您编写一个不应该与它们交互的词法分析器,则您不必了解它们。 John R. Levine 的“Lex and Yacc”是一本关于该工具的著名书籍。
    • 对。如果您手动滚动词法分析器,则不必担心 tokens.h。
    【解决方案2】:

    tokens.h 可能是由解析器生成器 (Yacc/Bison) 生成的包含令牌定义的文件,因此您可以将令牌从词法分析器返回到解析器。

    使用 Lex/Flex 和 Yacc/Bison,它的工作原理如下:

    parser.y:

    %token FOO
    %token BAR
    
    %%
    
    start: FOO BAR;
    
    %%
    

    lexer.l:

    %{
    #include "tokens.h"
    %}
    
    %%
    
    foo {return FOO;}
    bar {return BAR;}
    
    %%
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多