Flex / Bison编译器在标点符号处给出语法错误;总是“期望”同一件事

问题描述 投票:0回答:1

任何帮助,将不胜感激!我不知道此错误来自何处。

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.它不知道它已经在块中间了。我在那里吗?有什么想法起源吗?

parsing compiler-construction bison
1个回答
0
投票

"BEGIN|begin"与字符串BEGIN|begin匹配。这就是引号的含义:完全匹配此字符串。

如果要匹配BEGINbegin,则所需的模式是BEGIN|begin

© www.soinside.com 2019 - 2024. All rights reserved.