help-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

confusing bison error


From: Jot Dot
Subject: confusing bison error
Date: Thu, 26 Nov 2020 17:11:51 -0700 (MST)

FWIW: I'm new to flex/bison (lex/yacc) but I understand the basic concepts. 
win_flex 2.6.4 
bison (GNU Bison) 3.7.1 

I am hoping someone can point me in the right direction. I hope I have a 
setting wrong or missed something simple. 

I want to use ordinary symbols in rules for my .y file such as ';' and '>'. 
I'm making a pascal-like language 
Currently there are no s/r or r/r conflicts in the compiled grammar. 

Having said that, everything compiles but it seems like the parser can't pick 
up the single characters. 
For example, the parser rule: 

single_const_decl: IDENTIFIER '=' expression ; 

The parser returns an error after it gets the IDENTIFIER and fetches an error 
token instead of the '='. 
I have figured out how to get the trace output and can confirm this: 

Trace says it goes into state 6: 

State 6 

5 stmts: CONST_ . const_decl 
10 | CONST_ . const_decl ';' stmts 
46 const_decl: . single_const_decl 
47 | . const_decl ';' single_const_decl 
48 single_const_decl: . IDENTIFIER '=' expr 

IDENTIFIER shift, and go to state 14 <<<<< Trace says it goes to state 14 

const_decl go to state 15 
single_const_decl go to state 16 

State 14 

48 single_const_decl: IDENTIFIER . '=' expr 

'=' shift, and go to state 31 <<=== Does not happen. Returns an error token 
instead. 


I must be doing something wrong - I'm wondering if I'm missing something 
simple. 
Here's what I think what could be relevant lines of code: 

FLEX: 

%option nodefault 
%option c++ 
%option yyclass="Scanner" 
%option prefix="gen" 
%option noyywrap 

%option yylineno 
%option case-insensitive 
%option nounistd 
%option stack 

inum [0-9]+ 
alpha [A-Za-z_]+ 
ident {alpha}({alpha}|{inum})* 

/* *snip* */ 

%% 

/* *snip* */ 
{ident} { return gen::Parser::make_IDENTIFIER(result.makeIdentifier(yytext), 
loc); } 

/* everything else */ 
[ \t\r\n]+ ; /* whitespace */ 

. { return gen::Parser::make_YYerror(loc); } // { yyerror("Unknown character 
'%c'", *yytext); } 


NOTE: In case this matters, I would have assumed the whitespace rule and the 
'.' would have taken care of all possible input conditions but I still get 
this: 
1>Target FlexTarget: 
1> Process "scanner.l" flex file 
1> scanner.l:154: warning, -s option given but default rule can be matched 

There are no other errors/warnings for the file. 


BISON: 

/* C++ parser interface */ 
%skeleton "lalr1.cc" 
%require "3.2" 
%language "c++" 
%locations 
%defines 

%define api.parser.class { Parser } 
%define api.token.constructor 
%define api.value.type variant 
%define api.namespace { gen } 

%define parse.error verbose 
%define parse.lac full 

The parser rule in question is: 
single_const_decl: 
IDENTIFIER '=' expression { $$ = result.makeConstant($1, $3); } 
; 


Thanks for any help :) 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]