Parsing BISON语法分析中的基本问题

Parsing BISON语法分析中的基本问题,parsing,bison,Parsing,Bison,我是野牛队的新手,如果你能帮助我,我有一些基本问题: 以下哪一项是正确的: %left ’*’ ’/’ 或 这意味着我不用获取令牌,而是使用它在解析器文件中定义它 我可以这样定义一个规则吗: EXP -> EXP "and" EXP 而不是 EXP -> EXP AND EXP //AND here is a token 如果我有LEX和BISON文件来构建解析器,那么哪一个应该包含另一个,如果 我使用了一个公共头文件,其中一个文件应该在其中定义 如果BISON算法根据其中

我是野牛队的新手,如果你能帮助我,我有一些基本问题:

  • 以下哪一项是正确的:

    %left ’*’ ’/’
    

    这意味着我不用获取令牌,而是使用它在解析器文件中定义它

  • 我可以这样定义一个规则吗:

    EXP -> EXP "and" EXP 
    
    而不是

    EXP -> EXP AND EXP //AND here is a token
    
  • 如果我有LEX和BISON文件来构建解析器,那么哪一个应该包含另一个,如果 我使用了一个公共头文件,其中一个文件应该在其中定义

  • 如果BISON算法根据其中一条规则找到匹配项,首先会发生什么,它会进行reduce,然后执行为匹配规则定义的操作,或者首先执行操作,然后再执行reduce到堆栈

  • 由于格式的原因,很难说清你在问什么,但我认为答案是否定的。
    %left
    只定义了一个标记(与
    %token
    完全相同),并为该标记设置了优先级。您仍然需要通过在lexer中识别令牌并返回适当的令牌值来“获取”令牌

  • 虽然您可以使用
    和“
    ”,但您不想这样做,因为几乎不可能做到正确。最好使用
    (无引号)。不同之处在于,使用引号创建的标记不是作为
    .tab.h
    文件中的
    #define
    输出的,因此在lexer中生成该标记并不容易

  • 有很多方法可以做到这一点。最简单的方法是既不包含另一个,也让lex文件包含bison的
    -d
    标志生成的头——这是大多数示例所做的。也可以在
    .y
    文件的第三部分直接包含
    lex.yy.c
    文件,或者在
    .l
    文件的顶部包含
    .tab.c
    (但不能同时包含这两个!),在这种情况下,您将只编译一个文件

  • Its首先执行规则的操作(因此在操作执行时RHS上的项目值可用),然后执行堆栈缩减,将RHS项目替换为操作put int
    $$
    的值


  • 在第二点上,我有点不同意克里斯的观点。最好使用
    ”和“
    ”,因为在错误消息中,解析器将报告有关
    ”和“
    的信息,而不是关于
    TOK_和
    t_和
    的信息,这对用户来说肯定没有意义

    而且,要做到正确并不难:只要你

    %token TOK_AND "and"
    

    在某些地方,您可以在语法文件中使用
    和“
    TOK_和
    。但是,恕我直言,前者要清楚得多。

    现在可能更清楚了一点,我已经尝试过设置问题的格式,但我认为第一季度的问题是使用ASCII单引号U+0027撇号(
    )与Unicode(UTF-8)U+2019右单引号(
    )或U\U 2018左单引号(
    )。答案是,我相信Lex/Flex和Bison都希望使用撇号,而不是单引号。谢谢您的帮助,但是如果我使用另外两个文件.c和.h为.y文件中的操作定义外部函数,在.h文件中包含它们,函数的声明和实现在.c文件中呢
    %token TOK_AND "and"