Closed XinyaoYI closed 4 years ago
The original grammer:
1. atomic_clause_optseq : memory_order_clause_seq
2. | memory_order_clause_seq atomic_clause_seq
3. | memory_order_clause_seq ',' atomic_clause_seq
4. ;
5. memory_order_clause_seq :
6. | memory_order_clause hint_clause
7. | hint_clause memory_order_clause
8. | hint_clause ',' memory_order_clause
9. | memory_order_clause ',' hint_clause
10. | memory_order_clause
11. | hint_clause
12. ;
There should be a shift/reduce conflict between line 3 and line 8, and another shift/reduce conflict between line 3 and line 9. When we parsing an input like "memory_order_clause, hint_clause, atomic_clause", when the second comma be the lookahead token, line 8 shows the parser should reduce grammar "memory_order_clause_seq : hint_clause ',' memory_order_clause" but line 3 shows the parser should shift the comma. Same situdation happens between line 3 and line 9. So we delete line 8 and line 9, and list all possibilities one by one in the grammar of atomic_clause_optseq. The new grammar of atomic_clause_optseq should be:
atomic_clause_optseq : memory_order_clause_seq
| memory_order_clause_seq atomic_clause_seq
| hint_clause ',' memory_order_clause ',' atomic_clause_seq
| memory_order_clause ',' hint_clause ',' atomic_clause_seq
| memory_order_clause ','atomic_clause_seq
| hint_clause ',' memory_order_clause atomic_clause_seq
| memory_order_clause ',' hint_clause atomic_clause_seq
| hint_clause ','atomic_clause_seq
;
The grammar for atomic directive can be:
pragma omp atomic [clause[[[,] clause] ... ] [,]] atomic-clause [[,] clause [[[,] clause] ... ]] new-line
The grammar is: atomic_clause_optseq : memory_order_clause_seq | memory_order_clause_seq atomic_clause_seq | memory_order_clause_seq ',' atomic_clause_seq ; atomic_clause_seq : atomic_clause memory_order_clause_seq | atomic_clause ',' memory_order_clause_seq ; memory_order_clause_seq : | memory_order_clause hint_clause | hint_clause memory_order_clause | hint_clause ',' memory_order_clause | memory_order_clause ',' hint_clause | memory_order_clause | hint_clause ; If user inputs: "memory_order_clause, hint_clause, atomic_clause", there should be a shift/reduce conflict