Max Brunsfeld
4d63e26e9e
Clean up logic for falling back to error mode after lexing fails
2017-08-25 16:57:09 -07:00
Max Brunsfeld
86d5737fc2
Escape quotes when printing symbols to dot graphs
2017-08-25 16:26:40 -07:00
Max Brunsfeld
1dca3a0b58
Simplify parse version reordering
2017-08-04 14:51:14 -07:00
Max Brunsfeld
9260d8163c
Refactor and fix bugs in tree comparison algorithm
2017-08-04 14:03:41 -07:00
Max Brunsfeld
09f4796f6b
Get tests passing w/ new alias API
2017-08-01 14:35:34 -07:00
Max Brunsfeld
cb5fe80348
Rename RENAME rule to ALIAS, allow it to create anonymous nodes
2017-07-31 16:41:11 -07:00
Max Brunsfeld
1df41a9107
Avoid anonymous struct to silence gcc's override-init warning (again)
2017-07-21 10:17:54 -07:00
Max Brunsfeld
9a04231ab1
Remove length restriction in external scanner serialization API
2017-07-17 17:12:36 -07:00
Max Brunsfeld
99885788bc
🎨
2017-07-14 10:41:09 -07:00
Max Brunsfeld
4b40a1ed6c
Support anonymous tokens inside of RENAME rules
2017-07-14 10:19:58 -07:00
Max Brunsfeld
b3a72954ff
Introduce RENAME rule type
2017-07-13 17:17:22 -07:00
Max Brunsfeld
d8e9d04fe7
Add PREC_DYNAMIC rule for resolving runtime ambiguities
2017-07-06 15:24:45 -07:00
Max Brunsfeld
8f028ebf68
Avoid deep tree comparison when both trees have errors
2017-07-05 17:33:35 -07:00
Max Brunsfeld
782bf48772
Don't do skip_preceding_subtrees recovery when there are lots of versions
2017-07-05 15:34:19 -07:00
Max Brunsfeld
d322f0b6a7
🎨
2017-07-04 21:59:54 -07:00
Max Brunsfeld
e7ccd9c17c
Put back check for better existing versions during recover action
...
When checking for better existing versions, only kill the current
version if there is a better version earlier in the rotation.
2017-07-03 12:27:23 -07:00
Max Brunsfeld
f722923493
Limit the search depth for skip_preceding_trees recovery
2017-06-30 17:49:09 -07:00
Max Brunsfeld
d6579956f5
Enforce a hard version count limit during the recovery action
2017-06-30 17:49:09 -07:00
Max Brunsfeld
a89322c5f1
Remove unneeded parameters from public interface of stack_iterate callback
2017-06-29 16:43:56 -07:00
Max Brunsfeld
009d6d1534
Improve heuristics for pruning parse versions based on errors
...
* Rewrite the error cost comparison in terms of explicit, discrete
conditions.
* Allow merging versions have different error costs.
* Store the depth of each stack version since the last error. Use this
state to prevent incorrect merging.
* Sort the stack versions in order of preference and put a hard limit on
the version count.
2017-06-29 15:00:20 -07:00
Max Brunsfeld
0143bfdad4
Avoid use-after-free of external token states
...
Previously, it was possible for references to external token states to
outlive the trees to which those states belonged.
Now, instead of storing references to external token states in the Stack
and in the Lexer, we store references to the external token trees
themselves, and we retain the trees to prevent use-after-free.
2017-06-27 14:54:27 -07:00
Max Brunsfeld
513edec7c1
Merge pull request #77 from philipturnbull/scan-build-fixes
...
Fix errors found by scan-build
2017-06-20 10:15:20 -07:00
Phil Turnbull
cfca764d48
Root can never be NULL in this context
2017-06-15 07:47:16 -04:00
Max Brunsfeld
b862db766e
Merge remote-tracking branch 'origin/master' into update-fixture-grammars
2017-06-14 17:11:44 -07:00
Phil Turnbull
d1b19e8196
Prevent NULL pointer dereference in parser__accept
...
parser__select_tree can return true if 'left != NULL' and 'right == NULL' which
will later cause a NULL ptr deref:
src/runtime/parser.c:842:14: warning: Access to field 'ref_count' results in a dereference of a null pointer (loaded from variable 'root')
assert(root->ref_count > 0);
^~~~~~~~~~~~~~~
2017-06-14 11:12:06 -04:00
Phil Turnbull
da099d0bbe
Prevent NULL pointer dereference in parser__repair_error_callback
...
Because repair_reduction_count is unsigned, the default of '-1' is 0xffffffff
and will cause the loop to be entered if repair_reduction_count is NULL:
src/runtime/parser.c:691:11: warning: Dereference of null pointer
if (repair_reductions[j].params.symbol == repair->symbol) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2017-06-14 11:12:06 -04:00
Max Brunsfeld
e8a9bb7a51
🎨 Extract parser__halt_parse function
2017-05-01 14:41:55 -07:00
Max Brunsfeld
74f5ceddf7
Fix parsing of valid code with halt_on_error flag set
...
Signed-off-by: Tim Clem <timothy.clem@gmail.com>
2017-05-01 14:25:25 -07:00
Max Brunsfeld
a98d449d88
Add an option to immediately halt on syntax error
2017-05-01 13:50:49 -07:00
Max Brunsfeld
1f908324dc
Prevent infinite loop in skip_preceding_trees error recovery strategy
2017-03-21 12:14:44 -07:00
Max Brunsfeld
ed31e82ee6
Skip empty tokens when recovering from errors
2017-03-19 22:20:59 -07:00
Max Brunsfeld
d222dbb9fd
Allow lexer to accept tokens that ended at previous positions
...
* Track lookahead in each tree
* Add 'mark_end' API that external scanners can use
2017-03-13 17:06:52 -07:00
Max Brunsfeld
df520635c6
Prevent crash due to huge number of possible paths through parse stack
2017-02-20 14:34:10 -08:00
Max Brunsfeld
c14a776a3d
Avoid including trailing extra tokens within error nodes unnecessarily
2017-02-19 21:21:54 -08:00
Max Brunsfeld
93d7a75b09
Suppress one unnecessary type of error recovery variation
...
If we already have a stack version in which, for example,
a `function_call` is skipped, don't create another stack
version in which that `function_call` is reduced to an
`expression`, and then the `expression` is skipped. That
doesn't improve the error recovery at all, but adds to the
branching factor of the parse stack and makes things harder
to debug.
2017-02-07 22:07:56 -08:00
Max Brunsfeld
b01c5404eb
Ensure error_end_position variable is initialized
2017-02-07 17:48:53 -08:00
Max Brunsfeld
343887c1dd
Fix miscounting of extra tokens when repairing errors
2017-02-06 17:43:07 -08:00
Max Brunsfeld
672d491775
Fix errors in management of external scanner's most recent state
2017-01-30 22:04:46 -08:00
Max Brunsfeld
36608180d2
Store external token states in the parse stack
2017-01-08 22:06:05 -08:00
Max Brunsfeld
3a4daace26
Move reusable node functions to their own file
2017-01-05 10:07:27 -08:00
Max Brunsfeld
2fa7b453c8
Restore external scanner's state only after repositioning lexer
...
Also, properly identify the leaf node with the external token state
2016-12-21 13:59:56 -08:00
Max Brunsfeld
34a65f588d
Tweak naming and organization of external-scanner related language fields
2016-12-21 11:24:41 -08:00
Max Brunsfeld
e6c82ead2c
Start work toward maintaining external scanner's state during incremental parses
2016-12-20 17:06:20 -08:00
Max Brunsfeld
2b3da512a4
Add serialize, deserialize and reset callbacks to external scanners
...
Signed-off-by: Nathan Sobo <nathan@github.com>
2016-12-20 13:12:01 -08:00
Max Brunsfeld
7f6ec0131d
Remove duplication between parser_destroy and parser_set_language
2016-12-06 10:12:49 -08:00
Max Brunsfeld
c4fe8ded95
Remove state argument to Lexer advance method
2016-12-05 16:36:34 -08:00
Max Brunsfeld
c16b6b2059
Run external scanners during error recovery
2016-12-05 11:50:24 -08:00
Max Brunsfeld
cf0d8abea1
Destroy external scanner when destroying Parser
2016-12-04 14:18:30 -08:00
Max Brunsfeld
0f8e130687
Call external scanner functions when lexing
2016-12-02 22:03:48 -08:00
Max Brunsfeld
c966af0412
Start work on external tokens
2016-12-02 16:24:19 -08:00