Flex/Bison 编译器在标点符号处给出语法错误;总是 "expects" 同样的事情
Flex/Bison compiler gives syntax error at punctuation; always "expects" the same thing
如有任何帮助,我们将不胜感激!我不知道这个错误是从哪里来的。
3 月 19 日更新:
这是同一问题的一个更简单的示例:
scanner.l:
%{ #include <cstlib>
#include "parser.hpp"
%}
%option noyywrap
%%
"BEGIN|begin" { return TKBEGIN; }
"END|end" { return TKEND; }
"RETURN|return" { return TKRETURN;}
";" { return TKSEMICOLON; }
"\(" { return TKOPAREN; }
[ \n\t] {}
"[a-zA-Z][a-zA-Z0-9_]*" { return TKID; }
"(0|0x|[1-9])[0-9]+" { return TKNUMBER; }
"\'.\'" {return TKCHAR;}
"\"[^\"]*" {return TKSTRING;}
"." { fprintf(stderr, "Unexpected character %c (%d)\n", *yytext, *yytext); }
%%
parser.y:
%{
#include <iostream>
extern int yylex();
void yyerror(const char*);
%}
%define parse.error verbose
%token TKID
%token TKNUMBER
%token TKCHAR
%token TKSTRING
%token TKBEGIN
%token TKEND
%token TKRETURN
%token TKSEMICOLON
%token TKOPAREN
%%
Block: TKBEGIN StatementSequence TKEND {}
;
StatementSequence: StatementSequence TKSEMICOLON Statement {}
| Statement {}
;
Statement: ReturnStatement {}
;
ReturnStatement: TKRETURN OptExpression {}
;
OptExpression: TKOPAREN {}
;
%%
void yyerror(const char* msg){
std::cerr << msg << std::endl;
}
main.cpp:
extern int yyparse();
int main()
{
yyparse();
};
CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
project(compiler)
find_package(BISON)
find_package(FLEX)
bison_target(Parser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.cpp COMPILE_FLAGS -t )
flex_target(Scanner scanner.l ${CMAKE_CURRENT_BINARY_DIR}/scanner.cpp )
add_flex_bison_dependency(Scanner Parser)
set(EXTRA_COMPILE_FLAGS "-g3 -std=c++14")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_COMPILE_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
set(comp_srcs
main.cpp
${BISON_Parser_OUTPUTS}
${FLEX_Scanner_OUTPUTS}
)
source_group("Comp" FILES ${comp_srcs})
add_executable(compiler ${comp_srcs})
target_link_libraries(compiler ${BISON_LIBRARIES})
target_include_directories(compiler PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
return.cpsl:
begin
return (
end
为了构建它,我 运行 mkdir build; cd build/; cmake ..
然后我 运行 使用 ./compiler < ../return.cpsl
.
它返回的是:beginreturnsyntax error, unexpected TKOPAREN, expecting TKBEGIN
。
在我看来至少有两个问题:
1.出于某种原因它不喜欢标点符号
2. 它不明白它已经在一个块的中间。
我在那里吗?有什么想法是从哪里来的吗?
"BEGIN|begin"
匹配字符串 BEGIN|begin
。这就是引号的意思:完全匹配这个字符串。
如果您想匹配 BEGIN
或 begin
,您需要的模式是 BEGIN|begin
。
如有任何帮助,我们将不胜感激!我不知道这个错误是从哪里来的。
3 月 19 日更新:
这是同一问题的一个更简单的示例:
scanner.l:
%{ #include <cstlib>
#include "parser.hpp"
%}
%option noyywrap
%%
"BEGIN|begin" { return TKBEGIN; }
"END|end" { return TKEND; }
"RETURN|return" { return TKRETURN;}
";" { return TKSEMICOLON; }
"\(" { return TKOPAREN; }
[ \n\t] {}
"[a-zA-Z][a-zA-Z0-9_]*" { return TKID; }
"(0|0x|[1-9])[0-9]+" { return TKNUMBER; }
"\'.\'" {return TKCHAR;}
"\"[^\"]*" {return TKSTRING;}
"." { fprintf(stderr, "Unexpected character %c (%d)\n", *yytext, *yytext); }
%%
parser.y:
%{
#include <iostream>
extern int yylex();
void yyerror(const char*);
%}
%define parse.error verbose
%token TKID
%token TKNUMBER
%token TKCHAR
%token TKSTRING
%token TKBEGIN
%token TKEND
%token TKRETURN
%token TKSEMICOLON
%token TKOPAREN
%%
Block: TKBEGIN StatementSequence TKEND {}
;
StatementSequence: StatementSequence TKSEMICOLON Statement {}
| Statement {}
;
Statement: ReturnStatement {}
;
ReturnStatement: TKRETURN OptExpression {}
;
OptExpression: TKOPAREN {}
;
%%
void yyerror(const char* msg){
std::cerr << msg << std::endl;
}
main.cpp:
extern int yyparse();
int main()
{
yyparse();
};
CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
project(compiler)
find_package(BISON)
find_package(FLEX)
bison_target(Parser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.cpp COMPILE_FLAGS -t )
flex_target(Scanner scanner.l ${CMAKE_CURRENT_BINARY_DIR}/scanner.cpp )
add_flex_bison_dependency(Scanner Parser)
set(EXTRA_COMPILE_FLAGS "-g3 -std=c++14")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_COMPILE_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
set(comp_srcs
main.cpp
${BISON_Parser_OUTPUTS}
${FLEX_Scanner_OUTPUTS}
)
source_group("Comp" FILES ${comp_srcs})
add_executable(compiler ${comp_srcs})
target_link_libraries(compiler ${BISON_LIBRARIES})
target_include_directories(compiler PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
return.cpsl:
begin
return (
end
为了构建它,我 运行 mkdir build; cd build/; cmake ..
然后我 运行 使用 ./compiler < ../return.cpsl
.
它返回的是:beginreturnsyntax error, unexpected TKOPAREN, expecting TKBEGIN
。
在我看来至少有两个问题: 1.出于某种原因它不喜欢标点符号 2. 它不明白它已经在一个块的中间。 我在那里吗?有什么想法是从哪里来的吗?
"BEGIN|begin"
匹配字符串 BEGIN|begin
。这就是引号的意思:完全匹配这个字符串。
如果您想匹配 BEGIN
或 begin
,您需要的模式是 BEGIN|begin
。