Max Brunsfeld
172cbb2d22
Fix infinite loop due to skipping empty tokens during error recovery
2017-12-27 11:18:06 -08:00
Max Brunsfeld
2625c3a96c
Remove dead code in string_input.c
2017-12-27 10:34:29 -08:00
Max Brunsfeld
addeb6c4c1
Allocate and free trees using an object pool
2017-12-27 10:34:29 -08:00
Max Brunsfeld
0e69da37a5
Return a character count from the lexer's get_column method
2017-12-20 16:26:38 -08:00
Max Brunsfeld
fcff16cb86
Add get_column method to lexer
2017-12-19 17:54:15 -08:00
Max Brunsfeld
532bbeca0d
Remove wrong handling of \a in a regex
2017-12-12 16:50:53 -08:00
Max Brunsfeld
fbcefe25f7
Avoid creating external tokens that start after they end
2017-12-07 11:50:27 -08:00
Max Brunsfeld
5d676de051
Remove unnecessary conditional in parser__accept
2017-12-07 11:50:27 -08:00
Max Brunsfeld
493db39363
Never move the start rule of a grammar into the lexical grammar
...
This preserves a useful invariant that the root node of the AST is never
a token.
2017-12-07 11:50:27 -08:00
Max Brunsfeld
48681c3f0e
Initialize error start and end positions at their declarations
...
Fixes #113
Clang doesn't seem to be able to tell that these variables were guaranteed to
be initialized by the time they were read.
2017-10-31 10:06:44 -07:00
Max Brunsfeld
121a6a66ec
Take total dynamic precedence into account in stack version sorting
...
Signed-off-by: Josh Vera <vera@github.com>
2017-10-09 15:51:22 -07:00
Max Brunsfeld
36c2b685b9
Always invalidate old chunk of text when parsing after an edit
2017-10-04 15:09:46 -07:00
Max Brunsfeld
9f24118b17
Include trees' dynamic precedence in debug graphs
2017-10-04 10:41:20 -07:00
Max Brunsfeld
ba607a1f84
Optimize lex state merging
2017-09-18 13:40:37 -07:00
Max Brunsfeld
b0fdc33f73
Remove 'extra' and 'structural' booleans from symbol metadata
2017-09-14 12:07:46 -07:00
Max Brunsfeld
91456d7a17
Avoid duplicate error state entries for tokens that are both internal & external
2017-09-14 10:54:13 -07:00
Max Brunsfeld
2721f72c41
Represent MAX_COST_DIFFERENCE as unsigned
2017-09-13 16:49:18 -07:00
Max Brunsfeld
c1cf8e02a7
Merge pull request #101 from tree-sitter/merge-more-lex-states
...
Reduce the number of states in the generated lexer function
2017-09-13 16:46:58 -07:00
Max Brunsfeld
d291af9a31
Refactor error comparisons
...
* Deal with mergeability outside of error comparison function
* Make `better_version_exists` function pure (don't halt other versions
as a side effect).
* Tweak error comparison logic
Signed-off-by: Rick Winfrey <rewinfrey@github.com>
2017-09-13 16:38:15 -07:00
Max Brunsfeld
71595ffde6
Only allow one stack link with a given type containing errors
2017-09-13 10:05:31 -07:00
Max Brunsfeld
07fb3ab0e6
Abort recoveries before popping if better versions already exist
2017-09-13 09:56:51 -07:00
Max Brunsfeld
47669e6015
Avoid halting the only non-halted entry in recover
2017-09-12 16:20:06 -07:00
Max Brunsfeld
ee2906ac2e
Don't merge stack versions that are halted
2017-09-12 16:19:28 -07:00
Max Brunsfeld
819235bac3
Limit the number of stack nodes that are included in a summary
2017-09-12 12:00:00 -07:00
Max Brunsfeld
99d048e016
Simplify error recovery; eliminate recovery states
...
The previous approach to error recovery relied on special error-recovery
states in the parse table. For each token T, there was an error recovery
state in which the parser looked for *any* token that could follow T.
Unfortunately, sometimes the set of tokens that could follow T contained
conflicts. For example, in JS, the token '}' can be followed by the
open-ended 'template_chars' token, but also by ordinary tokens like
'identifier'. So with the old algorithm, when recovering from an
unexpected '}' token, the lexer had no way to distinguish identifiers
from template_chars.
This commit drops the error recovery states. Instead, when we encounter
an unexpected token T, we recover from the error by finding a previous
state S in the stack in which T would be valid, popping all of the nodes
after S, and wrapping them in an error.
This way, the lexer is always invoked in a normal parse state, in which
it is looking for a non-conflicting set of tokens. Eliminating the error
recovery states also shrinks the lex state machine significantly.
Signed-off-by: Rick Winfrey <rewinfrey@github.com>
2017-09-11 15:22:52 -07:00
Max Brunsfeld
4c9c05806a
Merge compatible starting token states before constructing lex table
2017-09-05 13:21:53 -07:00
Max Brunsfeld
9d668c5004
Move incompatible token map into LexTableBuilder
2017-08-31 15:46:37 -07:00
Max Brunsfeld
f8649824fa
Remove unused function
2017-08-31 15:30:44 -07:00
Max Brunsfeld
ac9d260734
Clean up parser fields
2017-08-31 12:50:10 -07:00
Max Brunsfeld
4a0587061e
Consolidate logic for deciding on a lookahead node
2017-08-31 12:19:37 -07:00
Max Brunsfeld
41074cbf2d
🎨
2017-08-30 16:48:15 -07:00
Max Brunsfeld
fdc6ee445b
Remove parser__push helper function
2017-08-30 16:41:07 -07:00
Max Brunsfeld
1b1276bdbf
Simplify parser__condense_stack function
2017-08-30 16:36:02 -07:00
Max Brunsfeld
96a630e5df
Clean up check for leaf node reusability
2017-08-30 16:19:51 -07:00
Max Brunsfeld
8bdab7335e
Remove unnecessary reusability check after breaking down lookahead
2017-08-30 16:19:11 -07:00
Max Brunsfeld
bef536a7d0
Discard fragile reusable nodes earlier
2017-08-30 16:17:10 -07:00
Max Brunsfeld
5cbd50c7d7
Remember how far ahead the lexer looked on failed calls
...
This needs to be included in the 'bytes_scanned' property of the token
that is ultimately produced.
2017-08-29 15:04:22 -07:00
Max Brunsfeld
f3977ec213
Always call deserialize on external scanner before scanning
...
Remembering the last token that the external scanner produced is
not worth the complexity.
2017-08-29 14:41:55 -07:00
Max Brunsfeld
c285fbef38
Clear LexTableBuilder's state after detecting conflicts
2017-08-25 17:11:39 -07:00
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
573b5f3671
Pass LexTableBuilder to ParseTableBuilder
2017-08-25 15:57:50 -07:00
Max Brunsfeld
eace426129
Suppress unknown pragma warnings in MSVC
2017-08-09 10:14:05 -07:00
Max Brunsfeld
9d649f3382
Remove depth-based error-recovery pruning criteria
...
This code was causing ambiguities to get resolved differently depending on
whether there was an unrelated error on the stack or not.
2017-08-09 09:53:41 -07:00
Max Brunsfeld
964dd16812
Avoid unicode escape sequences when generating conflict messages
2017-08-09 09:32:58 -07:00
Max Brunsfeld
5f40adb70c
Recur to sub-rules in a deterministic order in expand_repeats
2017-08-08 17:20:04 -07:00
Max Brunsfeld
e6b43700b9
Get generated parsers compiling and loading properly on windows
2017-08-08 16:47:51 -07:00
Max Brunsfeld
9d616b3bf8
Replace size_t -> LexStateId in LexTableBuilder::remove_duplicate_states
2017-08-08 12:55:35 -07:00
Max Brunsfeld
3d351eac09
Fix some C code that MSVC doesn't like
2017-08-08 10:47:59 -07:00
Max Brunsfeld
12623deb19
Avoid struct literal syntax in point functions
2017-08-08 10:42:21 -07:00