我正在尝试在虚拟词法分析器和解析器上运行 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.h
, Parser.h
, Parser.ih
, 和parse.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++ 跳过此方法的生成,或者以不同的方式生成它?