问题描述
我正在尝试在虚拟词法分析器和解析器上运行 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++ 跳过此方法的生成,或者以不同的方式生成它?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)