Fix(grammar): update sizeof operator precedence #292
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
problem
i was testing my c compiler on a corner case for
sizeofexpression, and i found that the output of tree-sitter is different from that of clang.the case is:
clang's output
tree-sitter's output (part of)
the reason that cause this difference is that, clang parses the remaining tokens after sizeof as a whole postfix-expression, while tree-sitter allows a more flat grammar and tried to address this by precedence.
solution
after analyzing the output of
tree-sitter parse --debug <<< 'int main() { sizeof(foo)(); }', i found out that there indeed are two options, and tree-sitter chose the wrong one due to the precedence ofcallandsizeofso i use
prec.dynamic(1, $.expression))instead of$.expression, and the problem is solved.test and verification
for the case
tree-sitter parse --debug <<< 'int main() { sizeof(foo)(); }'mentioned before, here is the comparisonlogs before this fix
after the fix
and i added it to the corpus, the other test cases remain unaffected.