llvm-project/clang-tools-extra/pseudo/test/lr-build-conflicts.test
Sam McCall bd5cc6575b [pseudo] Start rules are _ := start-symbol EOF, improve recovery.
Previously we were calling glrRecover() ad-hoc at the end of input.
Two main problems with this:
 - glrRecover() on two separate code paths is inelegant
 - We may have to recover several times in succession (e.g. to exit from
   nested scopes), so we need a loop at end-of-file
Having an actual shift action for an EOF terminal allows us to handle
both concerns in the main shift/recover/reduce loop.

This revealed a recovery design bug where recovery could enter a loop by
repeatedly choosing the same parent to identically recover from.
Addressed this by allowing each node to be used as a recovery base once.

Differential Revision: https://reviews.llvm.org/D130550
2022-08-19 16:49:37 +02:00

50 lines
1.6 KiB
Plaintext

_ := expr EOF
expr := expr - expr # S/R conflict at state 4 on '-' token
expr := IDENTIFIER
# RUN: clang-pseudo -grammar %s -print-graph | FileCheck %s --check-prefix=GRAPH
# GRAPH: States
# GRAPH-NEXT: State 0
# GRAPH-NEXT: _ := • expr EOF
# GRAPH-NEXT: expr := • expr - expr
# GRAPH-NEXT: expr := • IDENTIFIER
# GRAPH-NEXT: State 1
# GRAPH-NEXT: _ := expr • EOF
# GRAPH-NEXT: expr := expr • - expr
# GRAPH-NEXT: State 2
# GRAPH-NEXT: expr := IDENTIFIER •
# GRAPH-NEXT: State 3
# GRAPH-NEXT: _ := expr EOF •
# GRAPH-NEXT: State 4
# GRAPH-NEXT: expr := • expr - expr
# GRAPH-NEXT: expr := expr - • expr
# GRAPH-NEXT: expr := • IDENTIFIER
# GRAPH-NEXT: State 5
# GRAPH-NEXT: expr := expr - expr •
# GRAPH-NEXT: expr := expr • - expr
# GRAPH-NEXT: 0 ->[expr] 1
# GRAPH-NEXT: 0 ->[IDENTIFIER] 2
# GRAPH-NEXT: 1 ->[EOF] 3
# GRAPH-NEXT: 1 ->[-] 4
# GRAPH-NEXT: 4 ->[expr] 5
# GRAPH-NEXT: 4 ->[IDENTIFIER] 2
# GRAPH-NEXT: 5 ->[-] 4
# RUN: clang-pseudo -grammar %s -print-table | FileCheck %s --check-prefix=TABLE
# TABLE: LRTable:
# TABLE-NEXT: State 0
# TABLE-NEXT: IDENTIFIER: shift state 2
# TABLE-NEXT: expr: go to state 1
# TABLE-NEXT: State 1
# TABLE-NEXT: EOF: shift state 3
# TABLE-NEXT: -: shift state 4
# TABLE-NEXT: State 2
# TABLE-NEXT: EOF -: reduce by rule 2 'expr := IDENTIFIER'
# TABLE-NEXT: State 3
# TABLE-NEXT: State 4
# TABLE-NEXT: IDENTIFIER: shift state 2
# TABLE-NEXT: expr: go to state 5
# TABLE-NEXT: State 5
# TABLE-NEXT: -: shift state 4
# TABLE-NEXT: EOF -: reduce by rule 1 'expr := expr - expr'