Skip to content

Instantly share code, notes, and snippets.

@freakboy3742
Created January 13, 2016 06:39
Show Gist options
  • Save freakboy3742/97672c2e7c9a1c99ffff to your computer and use it in GitHub Desktop.
Save freakboy3742/97672c2e7c9a1c99ffff to your computer and use it in GitHub Desktop.
C++ parser failure
class Foo {
};
State : 0
Stack : . LexToken(CLASS,'class',2,1)
Action : Reduce rule [declaration_seq_opt -> <empty>] with [] and goto state 2
Result : <NoneType @ 0x1033a0da8> (None)
State : 2
Stack : declaration_seq_opt . LexToken(CLASS,'class',2,1)
Action : Reduce rule [util -> <empty>] with [] and goto state 3
Result : <NoneType @ 0x1033a0da8> (None)
State : 3
Stack : declaration_seq_opt util . LexToken(CLASS,'class',2,1)
Action : Reduce rule [start_search1 -> <empty>] with [] and goto state 5
Result : <NoneType @ 0x1033a0da8> (None)
State : 5
Stack : declaration_seq_opt util start_search1 . LexToken(CLASS,'class',2,1)
Action : Shift and goto state 47
State : 47
Stack : declaration_seq_opt util start_search1 CLASS . LexToken(IDENTIFIER,'Foo',2,7)
Action : Reduce rule [class_key -> CLASS] with ['class'] and goto state 84
Result : <NoneType @ 0x1033a0da8> (None)
State : 84
Stack : declaration_seq_opt util start_search1 class_key . LexToken(IDENTIFIER,'Foo',2,7)
Action : Shift and goto state 53
State : 53
Stack : declaration_seq_opt util start_search1 class_key IDENTIFIER . LexToken({,'{',2,11)
Action : Reduce rule [identifier -> IDENTIFIER] with ['Foo'] and goto state 113
Result : <NoneType @ 0x1033a0da8> (None)
State : 113
Stack : declaration_seq_opt util start_search1 class_key identifier . LexToken({,'{',2,11)
Action : Reduce rule [id -> identifier] with [None] and goto state 171
Result : <NoneType @ 0x1033a0da8> (None)
State : 171
Stack : declaration_seq_opt util start_search1 class_key id . LexToken({,'{',2,11)
Action : Reduce rule [nested_id -> id] with [None] and goto state 44
Result : <NoneType @ 0x1033a0da8> (None)
State : 44
Stack : declaration_seq_opt util start_search1 class_key nested_id . LexToken({,'{',2,11)
Action : Reduce rule [scoped_id -> nested_id] with [None] and goto state 283
Result : <NoneType @ 0x1033a0da8> (None)
State : 283
Stack : declaration_seq_opt util start_search1 class_key scoped_id . LexToken({,'{',2,11)
ERROR: Error : declaration_seq_opt util start_search1 class_key scoped_id . LexToken({,'{',2,11)
Traceback (most recent call last):
File "/usr/local/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/local/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/Users/rkm/projects/beeware/seasnake/seasnake/parser.py", line 2118, in <module>
parser.parse(preprocessed, debuglevel=10)
File "/Users/rkm/projects/beeware/seasnake/seasnake/parser.py", line 124, in parse
debug=debuglevel
File "/Users/rkm/projects/ply/ply/yacc.py", line 327, in parse
return self.parsedebug(input, lexer, debug, tracking, tokenfunc)
File "/Users/rkm/projects/ply/ply/yacc.py", line 595, in parsedebug
tok = call_errorfunc(self.errorfunc, errtoken, self)
File "/Users/rkm/projects/ply/ply/yacc.py", line 193, in call_errorfunc
r = errorfunc(token)
File "/Users/rkm/projects/beeware/seasnake/seasnake/parser.py", line 2071, in p_error
column=self.clex.find_tok_column(p)
File "/Users/rkm/projects/beeware/seasnake/seasnake/parser.py", line 102, in _parse_error
raise Exception("%s: %s" % (coord, msg))
Exception: Line 2, column 11: before: {
state 283
(420) class_specifier_head -> class_key scoped_id . colon_mark base_specifier_list {
(422) class_specifier_head -> class_key scoped_id . {
(418) elaborated_class_specifier -> class_key scoped_id .
(419) elaborated_class_specifier -> class_key scoped_id . colon_mark error
(417) colon_mark -> . :
{ shift and go to state 490
CHAR reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
WCHAR_T reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
BOOL reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
SHORT reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
INT reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
LONG reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
SIGNED reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
UNSIGNED reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
FLOAT reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
DOUBLE reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
VOID reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
FRIEND reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
TYPEDEF reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
REGISTER reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
STATIC reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
MUTABLE reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
EXTERN reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
AUTO reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
EXPLICIT reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
INLINE reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
VIRTUAL reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
CONST reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
VOLATILE reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
SCOPE reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
TEMPLATE reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
ENUM reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
TYPENAME reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
OPERATOR reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
IDENTIFIER reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
CLASS reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
STRUCT reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
UNION reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
[ reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
. reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
ARROW reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
INC reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
DEC reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
( reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
DOT_STAR reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
ARROW_STAR reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
/ reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
% reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
* reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
+ reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
- reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
SHL reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
SHR reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
< reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
> reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
LE reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
GE reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
EQ reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
NE reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
& reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
^ reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
| reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
LOG_AND reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
= reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
? reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
LOG_OR reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
ASS_ADD reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
ASS_AND reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
ASS_DIV reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
ASS_MOD reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
ASS_MUL reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
ASS_OR reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
ASS_SHL reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
ASS_SHR reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
ASS_SUB reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
ASS_XOR reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
, reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
: reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
TRY reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
; reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
ELLIPSIS reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
) reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
] reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
# reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
} reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
error reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .)
! { [ reduce using rule 418 (elaborated_class_specifier -> class_key scoped_id .) ]
! : [ shift and go to state 488 ]
colon_mark shift and go to state 489
state 44
(12) scoped_id -> nested_id .
CHAR reduce using rule 12 (scoped_id -> nested_id .)
WCHAR_T reduce using rule 12 (scoped_id -> nested_id .)
BOOL reduce using rule 12 (scoped_id -> nested_id .)
SHORT reduce using rule 12 (scoped_id -> nested_id .)
INT reduce using rule 12 (scoped_id -> nested_id .)
LONG reduce using rule 12 (scoped_id -> nested_id .)
SIGNED reduce using rule 12 (scoped_id -> nested_id .)
UNSIGNED reduce using rule 12 (scoped_id -> nested_id .)
FLOAT reduce using rule 12 (scoped_id -> nested_id .)
DOUBLE reduce using rule 12 (scoped_id -> nested_id .)
VOID reduce using rule 12 (scoped_id -> nested_id .)
FRIEND reduce using rule 12 (scoped_id -> nested_id .)
TYPEDEF reduce using rule 12 (scoped_id -> nested_id .)
REGISTER reduce using rule 12 (scoped_id -> nested_id .)
STATIC reduce using rule 12 (scoped_id -> nested_id .)
MUTABLE reduce using rule 12 (scoped_id -> nested_id .)
EXTERN reduce using rule 12 (scoped_id -> nested_id .)
AUTO reduce using rule 12 (scoped_id -> nested_id .)
EXPLICIT reduce using rule 12 (scoped_id -> nested_id .)
INLINE reduce using rule 12 (scoped_id -> nested_id .)
VIRTUAL reduce using rule 12 (scoped_id -> nested_id .)
CONST reduce using rule 12 (scoped_id -> nested_id .)
VOLATILE reduce using rule 12 (scoped_id -> nested_id .)
SCOPE reduce using rule 12 (scoped_id -> nested_id .)
TEMPLATE reduce using rule 12 (scoped_id -> nested_id .)
ENUM reduce using rule 12 (scoped_id -> nested_id .)
TYPENAME reduce using rule 12 (scoped_id -> nested_id .)
OPERATOR reduce using rule 12 (scoped_id -> nested_id .)
IDENTIFIER reduce using rule 12 (scoped_id -> nested_id .)
CLASS reduce using rule 12 (scoped_id -> nested_id .)
STRUCT reduce using rule 12 (scoped_id -> nested_id .)
UNION reduce using rule 12 (scoped_id -> nested_id .)
[ reduce using rule 12 (scoped_id -> nested_id .)
. reduce using rule 12 (scoped_id -> nested_id .)
ARROW reduce using rule 12 (scoped_id -> nested_id .)
INC reduce using rule 12 (scoped_id -> nested_id .)
DEC reduce using rule 12 (scoped_id -> nested_id .)
( reduce using rule 12 (scoped_id -> nested_id .)
DOT_STAR reduce using rule 12 (scoped_id -> nested_id .)
ARROW_STAR reduce using rule 12 (scoped_id -> nested_id .)
/ reduce using rule 12 (scoped_id -> nested_id .)
% reduce using rule 12 (scoped_id -> nested_id .)
* reduce using rule 12 (scoped_id -> nested_id .)
+ reduce using rule 12 (scoped_id -> nested_id .)
- reduce using rule 12 (scoped_id -> nested_id .)
SHL reduce using rule 12 (scoped_id -> nested_id .)
SHR reduce using rule 12 (scoped_id -> nested_id .)
< reduce using rule 12 (scoped_id -> nested_id .)
> reduce using rule 12 (scoped_id -> nested_id .)
LE reduce using rule 12 (scoped_id -> nested_id .)
GE reduce using rule 12 (scoped_id -> nested_id .)
EQ reduce using rule 12 (scoped_id -> nested_id .)
NE reduce using rule 12 (scoped_id -> nested_id .)
& reduce using rule 12 (scoped_id -> nested_id .)
^ reduce using rule 12 (scoped_id -> nested_id .)
| reduce using rule 12 (scoped_id -> nested_id .)
LOG_AND reduce using rule 12 (scoped_id -> nested_id .)
= reduce using rule 12 (scoped_id -> nested_id .)
? reduce using rule 12 (scoped_id -> nested_id .)
LOG_OR reduce using rule 12 (scoped_id -> nested_id .)
ASS_ADD reduce using rule 12 (scoped_id -> nested_id .)
ASS_AND reduce using rule 12 (scoped_id -> nested_id .)
ASS_DIV reduce using rule 12 (scoped_id -> nested_id .)
ASS_MOD reduce using rule 12 (scoped_id -> nested_id .)
ASS_MUL reduce using rule 12 (scoped_id -> nested_id .)
ASS_OR reduce using rule 12 (scoped_id -> nested_id .)
ASS_SHL reduce using rule 12 (scoped_id -> nested_id .)
ASS_SHR reduce using rule 12 (scoped_id -> nested_id .)
ASS_SUB reduce using rule 12 (scoped_id -> nested_id .)
ASS_XOR reduce using rule 12 (scoped_id -> nested_id .)
) reduce using rule 12 (scoped_id -> nested_id .)
, reduce using rule 12 (scoped_id -> nested_id .)
] reduce using rule 12 (scoped_id -> nested_id .)
; reduce using rule 12 (scoped_id -> nested_id .)
: reduce using rule 12 (scoped_id -> nested_id .)
TRY reduce using rule 12 (scoped_id -> nested_id .)
{ reduce using rule 12 (scoped_id -> nested_id .)
ELLIPSIS reduce using rule 12 (scoped_id -> nested_id .)
# reduce using rule 12 (scoped_id -> nested_id .)
} reduce using rule 12 (scoped_id -> nested_id .)
error reduce using rule 12 (scoped_id -> nested_id .)
@freakboy3742
Copy link
Author

This is a partial state machine describing a PLY (Python-Lex-Yacc) grammar for C++. input.cpp is the file being parsed. It throws an error when it reaches the opening brace.

If I make Foo a subclass of Bar, the grammar works fine. But without the : public Bar suffix, it blows up as shown in the runtime output.

The problem appears to be with State 258 - but I can't see why it doesn't follow Rule 422, and go to State 490.

@freakboy3742
Copy link
Author

The full project can be obtained at https://github.com/pybee/seasnake; in a Python 3 virtual environment, install the project, save the sample C++ file, and run python -m seasnake.parser sample.cpp.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment