passlab / ompparser

ompparser: A Standalone and Unified OpenMP Parser
https://github.com/passlab/ompparser
Other
5 stars 1 forks source link

Shift/Reduce conflict in atomic directive #108

Closed XinyaoYI closed 4 years ago

XinyaoYI commented 4 years ago

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

XinyaoYI commented 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
                     ;