使用 Bisonc++ 跳过 Parser::lex() 方法预定义

问题描述

我正在尝试在虚拟词法分析器和解析器上运行 Flex 和 Bisonc++。这是我的词法分析器,Flex 从中生成正确的 lex.yy.cc 文件

%option noyywrap c++ yylineno

%{
#include "Parserbase.h"
%}

LETTER          [a-zA-Z]
NUMBER          [0-9]
WHITESPACE      [ \t\n]

%%
"which"                     { return Parser::WHICH; }
"file"                      { return Parser::SOURCEFILE; }
"commit"                    { return Parser::COMMIT; }
"dev"                       { return Parser::DEV; }
"team"                      { return Parser::TEAM; }
("_"|{LETTER})("_"|{LETTER}|{NUMBER})*          { return Parser::IDENTIFIER; }
","                     { return Parser::COMMA; }
";"                                             { return Parser::SEMICOLON; }


{WHITESPACE}+                                   // Skip.

%%

这是我的虚拟句法分析器:

%baseclass-preinclude <iostream>

%token IDENTIFIER SEMICOLON COMMA WHICH SOURCEFILE TEAM DEV COMMIT

%%

start:
    WHICH returnList SEMICOLON { std::cout << ("Processing symbols.") << std::endl; }
;

returnList:
    fileUnit
|
    devUnit
|
    teamunit
|
    commitUnit
;

fileUnit:
    SOURCEFILE
|
    SOURCEFILE COMMA returnList
;

devUnit:
    DEV
|
    DEV COMMA returnList
;

teamunit:
    TEAM
|
    TEAM COMMA returnList
;

commitUnit:
    COMMIT
|
    COMMIT COMMA returnList
;

Bisonc++ -- 正如它应该的那样 -- 生成 Parserbase.hParser.hParser.ihparse.cc 文件。但是,Parser.ih 包含以下方法

inline int Parser::lex()
{
    return d_scanner.lex();
}

我在 Bisonc++ 的文档中读到,如果提供了 --scanner=<pathname>,则会生成方法,尽管我在没有它的情况下运行 Bisonc++。生成文件不包含 d_scanner 对象。当我尝试编译生成的 *.cc 文件时,出现以下错误

error: ‘d_scanner’ was not declared in this scope

我的问题是,我该怎么做才能让 Bisonc++ 跳过此方法生成,或者以不同的方式生成它?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)