Bison和Flex语法中规则的重用

Bison和Flex语法中规则的重用,bison,flex-lexer,Bison,Flex Lexer,我试图在客户端和服务器之间建立一个消息的请求-响应序列。 为了解析消息,我使用了flex和bison语法。 我有一个关于在不同语法中重用规则的问题。 例如,如果我有一个语法来处理请求 req_message: request_message |response_message |error ; 请求消息在哪里 request_message: |request_header_list request_hdr 请求_hdr是 request_hdr:

我试图在客户端和服务器之间建立一个消息的请求-响应序列。 为了解析消息,我使用了flex和bison语法。 我有一个关于在不同语法中重用规则的问题。 例如,如果我有一个语法来处理请求

req_message:
    request_message
    |response_message
    |error
    ; 
请求消息在哪里

request_message:
    |request_header_list request_hdr
请求_hdr是

request_hdr:
    accept
    |accept_language
    |bandwidth
    |user_agent
    |session
    |cseq
    |cache_control
    ..
    ;
同样地,对于回答,我有一个语法

response_header:
    cseq
    |session
    |range
    |public
    |server
    |content_type
    ..
    ;

为了解析
cseq
,我只定义了一条规则。解析请求时,该规则工作正常。但是在解析响应时,规则没有显示出来。是否有类似的情况,相同的规则不能用于不同的语法?为什么它是为请求而工作,而不是为响应而工作?在lex方面,我发现解析lexim没有问题,它能够将
cseq令牌
返回到yacc

在没有看到更多yacc规范的情况下诊断问题有点困难。特别是,查看
响应消息的生成(语法规则)将非常有帮助。但是,即使没有这些信息,我也注意到您的命名不一致。您有
request\u hdr
response\u header
。这是故意的吗

响应\头是响应消息发送的一部分。。。我没有在问题中对其进行定义。请求头和响应头包含不同的字段,这就是为什么我同时包含这两个字段。