如何只使用两个lookahead标记来解析C声明器?

如何只使用两个lookahead标记来解析C声明器?,c,parsing,compiler-construction,C,Parsing,Compiler Construction,看,好像是(code)intf(int),可以解释为 “函数f(int)”“使用”(“抽象声明器”)”规则或 “函数f(函数(int))”使用“(“参数类型列表”)”规则 但是,当我用bison编译文件时,除了悬挂的if/else之外,它没有提到任何shift-reduce冲突cdecl只是说“语法错误”。GCC和Clang似乎将其解析为2: $ gcc -x c - -o /dev/stdout -S "$@" int f((int)); <stdin>:1:7: error: e

看,好像是(code)intf(int),可以解释为

  • “函数f(int)”“使用
    ”(“抽象声明器”)”
    规则或
  • “函数f(函数(int))”使用
    “(“参数类型列表”)”
    规则
  • 但是,当我用bison编译文件时,除了悬挂的if/else之外,它没有提到任何shift-reduce冲突
    cdecl
    只是说“语法错误”。GCC和Clang似乎将其解析为2:

    $ gcc -x c - -o /dev/stdout -S "$@"
    int f((int));
    <stdin>:1:7: error: expected declaration specifiers or '...' before '(' token
    $ clang -x c - -o /dev/stdout -S "$@"
    int f((int));
    <stdin>:1:8: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
    
    $gcc-xc--o/dev/stdout-S“$@”
    intf((int));
    :1:7:错误:应为声明说明符或“(”标记)之前的“…”
    $clang-xc--o/dev/stdout-S“$@”
    intf((int));
    :1:8:警告:缺少类型说明符,默认为“int”[-Wimplicit int]
    

    正确的解析方法是什么?这足够神秘吗?我应该假设没有人在使用语言的这一部分吗?

    看看
    参数列表的语法。它要求每个参数都有
    声明说明符和一个声明符。
    '('abstract\u declarator')
    '(“参数类型列表”)“
    都是声明符,但
    声明说明符在哪里?
    啊,我不知道在
    声明说明符周围不能有括号。所以整个事情都是无效语法。谢谢!相关:@Broman处理表达式和运算符优先级,我的问题是关于声明的。@HolyBlackCat:不应该吗首先是答案?查看
    参数列表的语法。它要求每个参数都有
    声明说明符和声明符。
    (“抽象声明符”)
    (“参数类型列表”)“
    都是声明符,但
    声明说明符在哪里?
    啊,我不知道在
    声明说明符周围不能有括号。所以整个事情都是无效语法。谢谢!相关:@Broman处理表达式和运算符优先级,我的问题是关于声明的。@HolyBlackCat:不应该吗至少可以回答吗?