I’m trying to understand flex/bison, but the documentation is a bit difficult for me, and I’ve probably grossly misunderstood something. Here’s a test case: http://namakajiri.net/misc/bison_charlit_test/
File “a” contains the single character ‘a’. “foo.y” has a trivial grammar like this:
%%
file: 'a' ;
The generated parser can’t parse file “a”; it gives a syntax error.
The grammar “bar.y” is almost the same, only I changed the character literal for a named token:
%token TOK_A;
%%
file: TOK_A;
and then in bar.lex:
a { return TOK_A; }
This one works just fine.
What am I doing wrong in trying to use character literals directly as bison terminals, like in the docs?
I’d like my grammar to look like “statement: selector ‘{‘ property ‘:’ value ‘;’ ‘}'” and not “statement: selector LBRACE property COLON value SEMIC RBRACE”…
I’m running bison 2.5 and flex 2.5.35 in debian wheezy.
Rewrite
The problem is a runtime problem, not a compile time problem.
The trouble is that you have two radically different lexical analyzers.
The
bar.lexanalyzer recognizes anain the input and returns it as a TOK_A and ignores everything else.The
foo.lexanalyzer echoes every single character, but that’s all.foo.lex — as written
foo.lex — equivalent
foo.lex — required
Working code
Here’s some working code with diagnostic printing in place.
foo-lex.l
foo.y
Compilation and execution
Point of detail: how did that blank line get into the output? Answer: the lexical analyzer put it there. The pattern
.does not match a newline, so the newline was treated as if there was a rule:This is why the input was accepted. If you change the
foo-lex.lfile to:and then recompile and run again, the output is:
with no blank lines. This is because the grammar doesn’t allow a newline to appear in a valid ‘file’.