From 72025e38d9e8fb48d98b89cfb7c623b88adc6707 Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Wed, 8 Mar 2017 17:11:23 +0100
Subject: [PATCH] improve AST of OpenACC

---
 Parser/spec/OpenAcc.rats | 231 +++++++++++++++++++--------------------
 1 file changed, 114 insertions(+), 117 deletions(-)

diff --git a/Parser/spec/OpenAcc.rats b/Parser/spec/OpenAcc.rats
index d9fe627..87ca2bd 100644
--- a/Parser/spec/OpenAcc.rats
+++ b/Parser/spec/OpenAcc.rats
@@ -32,6 +32,13 @@ List<Variable> var_list =
         }
 ;
 
+List<Variable> p_var_list =
+    LPAREN vl:(COMMA yyValue:variable)* RPAREN
+        {
+            yyValue = new List().addAll(vl.list());
+        }
+;
+
 List<Expr> expr_list =
     e:expr el:(COMMA yyValue:expr)*
         {
@@ -42,12 +49,13 @@ List<Expr> expr_list =
 //// // An AccStmt does not have a label or a comment (unlike Fortran statements).
 //// // It must, however, begin with ""!$acc" and end with a line break
 //// abstract AccStmt ;
+//// abstract AccAbstractDataStmt ::= AccClause* ;
 
 // constructs ------------------------------------------------------------------
 
 //// abstract AccConstruct:ExecutableConstruct ;
 AccConstruct acc_construct =
- 	acc_parallel_construct
+ 	  acc_parallel_construct
 /   acc_kernels_construct
 /   acc_data_construct
 /   acc_atomic_construct
@@ -65,7 +73,7 @@ AccParallelConstruct acc_parallel_construct =
 		}
 ;
 
-//// AccParallelStmt:AccStmt ::= AccClause* ;
+//// AccParallelStmt:AccAbstractDataStmt ;
 AccParallelStmt acc_parallel_stmt =
     A_P A_PARALLEL LB
         {
@@ -96,7 +104,7 @@ AccKernelsConstruct acc_kernels_construct =
 		}
 ;
 
-//// AccKernelsStmt:AccStmt ::= AccClause* ;
+//// AccKernelsStmt:AccAbstractDataStmt ;
 AccKernelsStmt acc_kernels_stmt =
     A_P A_KERNELS LB
         {
@@ -127,7 +135,7 @@ AccDataConstruct acc_data_construct =
 		}
 ;
 
-//// AccDataStmt:AccStmt ::= AccClause* ;
+//// AccDataStmt:AccAbstractDataStmt ;
 AccDataStmt acc_data_stmt =
     A_P A_DATA LB
         {
@@ -296,7 +304,7 @@ AccParallelLoopConstruct acc_parallel_loop_construct =
 		}
 ;
 
-//// AccParallelLoopStmt:AccStmt ::= AccClause* ;
+//// AccParallelLoopStmt:AccAbstractDataStmt ;
 AccParallelLoopStmt acc_parallel_loop_stmt =
     A_P A_PARALLEL A_LOOP LB
         {
@@ -327,7 +335,7 @@ AccKernelsLoopConstruct acc_kernels_loop_construct =
 		}
 ;
 
-//// AccKernelsLoopStmt:AccStmt ::= AccClause* ;
+//// AccKernelsLoopStmt:AccAbstractDataStmt ;
 AccKernelsLoopStmt acc_kernels_loop_stmt =
     A_P A_KERNELS A_LOOP LB
         {
@@ -388,9 +396,9 @@ AccExitDataDirective acc_exit_data_directive =
 //// // ACC 2.10
 //// AccCacheDirective:AccDirective ::= Variable* ;
 AccCacheDirective acc_cache_directive =
-	A_P A_CACHE LPAREN vl:var_list RPAREN LB
+	A_P A_CACHE list:p_var_list LB
 		{
-			yyValue = new AccCacheDirective(new Opt<Label>(), new Comment(new Opt<CommentContent>()), vl);
+			yyValue = new AccCacheDirective(new Opt<Label>(), new Comment(new Opt<CommentContent>()), list);
 		}
 ;
 
@@ -471,19 +479,9 @@ List acc_clause_list =
 public AccClause acc_clause =
 	acc_if_clause
 /	acc_reduction_clause
-/	acc_copy_clause
-/	acc_copyin_clause
-/	acc_copyout_clause
-/	acc_create_clause
-/	acc_delete_clause
 /	acc_device_clause
 /	acc_firstprivate_clause
-/	acc_pcopy_clause
-/	acc_pcopyin_clause
-/	acc_pcopyout_clause
-/	acc_pcreate_clause
 /	acc_private_clause
-/	acc_present_clause
 /	acc_use_device_clause
 /	acc_default_none_clause
 /	acc_device_type_clause
@@ -506,8 +504,95 @@ public AccClause acc_clause =
 /	acc_bind_clause
 /	acc_seq_clause
 /	acc_shortloop_clause
-/   acc_deviceptr_clause
-/   acc_auto_clause
+/ acc_auto_clause
+/ acc_data_clause
+;
+
+//// abstract AccDataClause:AccClause ::= Variable* ;
+AccDataClause acc_data_clause =
+  acc_deviceptr_clause
+/	acc_present_clause
+/	acc_copy_clause
+/	acc_copyin_clause
+/	acc_copyout_clause
+/	acc_create_clause
+/	acc_delete_clause
+;
+
+//// AccDeviceptrClause:AccDataClause ;
+AccDeviceptrClause acc_deviceptr_clause =
+    A_DEVICEPTR list:p_var_list
+        {
+            yyValue = new AccDeviceptrClause(list);
+        }
+;
+
+//// AccPresentClause:AccDataClause ;
+AccPresentClause acc_present_clause =
+	A_PRESENT list:p_var_list
+		{
+			yyValue = new AccPresentClause(list);
+		}
+;
+
+//// AccCopyClause:AccDataClause ;
+//// AccPresentOrCopyClause:AccCopyClause ;
+AccCopyClause acc_copy_clause =
+	A_COPY list:p_var_list
+		{
+			yyValue = new AccCopyClause(list);
+		}
+/	(A_PCOPY / A_PRESENT_OR_COPY) list:p_var_list
+		{
+			yyValue = new AccPresentOrCopyClause(list);
+		}
+;
+
+//// AccCopyInClause:AccDataClause ;
+//// AccPresentOrCopyInClause:AccCopyClause ;
+AccCopyInClause acc_copyin_clause =
+	A_COPYIN list:p_var_list
+		{
+			yyValue = new AccCopyInClause(list);
+		}
+/	(A_PCOPYIN / A_PRESENT_OR_COPYIN) list:p_var_list
+		{
+			yyValue = new AccPresentOrCopyInClause(list);
+		}
+;
+
+//// AccCopyOutClause:AccDataClause ;
+//// AccPresentOrCopyOutClause:AccCopyClause ;
+AccCopyOutClause acc_copyin_clause =
+	A_COPYOUT list:p_var_list
+		{
+			yyValue = new AccCopyOutClause(list);
+		}
+/	(A_PCOPYOUT / A_PRESENT_OR_COPYOUT) list:p_var_list
+		{
+			yyValue = new AccPresentOrCopyOutClause(list);
+		}
+;
+
+//// AccCreateClause:AccDataClause ;
+//// AccPresentOrCreateClause:AccCreateClause ;
+AccCreateClause acc_create_clause =
+	A_CREATE list:p_var_list
+		{
+			yyValue = new AccCreateClause(list);
+		}
+/	(A_PCREATE / A_PRESENT_OR_CREATE) list:p_var_list
+		{
+			yyValue = new AccPresentOrCreateClause(list);
+		}
+;
+
+//// AccDeleteClause:AccDataClause ;
+AccDeleteClause acc_delete_clause =
+	A_DELETE list:p_var_list
+		{
+			yyValue = new AccDeleteClause(list);
+		}
 ;
 
 //// AccIfClause:AccClause ::= Condition:Expr ;
@@ -560,65 +645,9 @@ AccOperator acc_operator =
 /	A_NEQV { yyValue = new AccOperatorNEqv(); }
 ;
 
-//// AccDeviceptrClause:AccClause ::= Variable* ;
-AccDeviceptrClause acc_deviceptr_clause =
-    A_DEVICEPTR LPAREN list:var_list RPAREN
-        {
-            yyValue = new AccDeviceptrClause(list);
-        }
-;
-
-//// AccCopyClause:AccClause ::= Variable* ;
-AccCopyClause acc_copy_clause =
-	A_COPY LPAREN list:var_list RPAREN
-		{
-			yyValue = new AccCopyClause(list);
-		}
-;
-
-//// AccCopyInClause:AccClause ::= Variable* ;
-AccCopyInClause acc_copyin_clause =
-	A_COPYIN LPAREN list:var_list RPAREN
-		{
-			yyValue = new AccCopyInClause(list);
-		}
-;
-
-//// AccCopyOutClause:AccClause ::= Variable* ;
-AccCopyOutClause acc_copyout_clause =
-	A_COPYOUT LPAREN list:var_list RPAREN
-		{
-			yyValue = new AccCopyOutClause(list);
-		}
-;
-
-//// AccCreateClause:AccClause ::= Variable* ;
-AccCreateClause acc_create_clause =
-	A_CREATE LPAREN list:var_list RPAREN
-		{
-			yyValue = new AccCreateClause(list);
-		}
-;
-
-//// AccDeleteClause:AccClause ::= Variable* ;
-AccDeleteClause acc_delete_clause =
-	A_DELETE LPAREN list:var_list RPAREN
-		{
-			yyValue = new AccDeleteClause(list);
-		}
-;
-
-//// AccPresentClause:AccClause ::= Variable* ;
-AccPresentClause acc_present_clause =
-	A_PRESENT LPAREN list:var_list RPAREN
-		{
-			yyValue = new AccPresentClause(list);
-		}
-;
-
 //// AccDeviceClause:AccClause ::= Variable* ;
 AccDeviceClause acc_device_clause =
-	A_DEVICE LPAREN list:var_list RPAREN
+	A_DEVICE list:p_var_list
 		{
 			yyValue = new AccDeviceClause(list);
 		}
@@ -626,47 +655,15 @@ AccDeviceClause acc_device_clause =
 
 //// AccFirstPrivateClause:AccClause ::= Variable* ;
 AccFirstPrivateClause acc_firstprivate_clause =
-	A_FIRSTPRIVATE LPAREN list:var_list RPAREN
+	A_FIRSTPRIVATE list:p_var_list
 		{
 			yyValue = new AccFirstPrivateClause(list);
 		}
 ;
 
-//// AccPresentOrCopyClause:AccClause ::= Variable* ;
-AccPresentOrCopyClause acc_pcopy_clause =
-	(A_PCOPY / A_PRESENT_OR_COPY) LPAREN list:var_list RPAREN
-		{
-			yyValue = new AccPresentOrCopyClause(list);
-		}
-;
-
-//// AccPresentOrCopyInClause:AccClause ::= Variable* ;
-AccPresentOrCopyInClause acc_pcopyin_clause =
-	(A_PCOPYIN / A_PRESENT_OR_COPYIN) LPAREN list:var_list RPAREN
-		{
-			yyValue = new AccPresentOrCopyInClause(list);
-		}
-;
-
-//// AccPresentOrCopyOutClause:AccClause ::= Variable* ;
-AccPresentOrCopyOutClause acc_pcopyout_clause =
-	(A_PCOPYOUT / A_PRESENT_OR_COPYOUT) LPAREN list:var_list RPAREN
-		{
-			yyValue = new AccPresentOrCopyOutClause(list);
-		}
-;
-
-//// AccPresentOrCreateClause:AccClause ::= Variable* ;
-AccPresentOrCreateClause acc_pcreate_clause =
-	(A_PCREATE / A_PRESENT_OR_CREATE) LPAREN list:var_list RPAREN
-		{
-			yyValue = new AccPresentOrCreateClause(list);
-		}
-;
-
 //// AccPrivateClause:AccClause ::= Variable* ;
 AccPrivateClause acc_private_clause =
-	A_PRIVATE LPAREN list:var_list RPAREN
+	A_PRIVATE list:p_var_list
 		{
 			yyValue = new AccPrivateClause(list);
 		}
@@ -674,7 +671,7 @@ AccPrivateClause acc_private_clause =
 
 //// AccUseDeviceClause:AccClause ::= Variable* ;
 AccUseDeviceClause acc_use_device_clause =
-	A_USEDEVICE LPAREN list:var_list RPAREN
+	A_USEDEVICE list:p_var_list
 		{
 			yyValue = new AccUseDeviceClause(list);
 		}
@@ -696,7 +693,7 @@ AccDeviceTypeClause acc_device_type_clause =
 		{
 			yyValue = new AccDeviceTypeStarClause();
 		}
-/	(A_DEVICE_TYPE / A_DTYPE) LPAREN list:var_list RPAREN
+/	(A_DEVICE_TYPE / A_DTYPE) list:p_var_list
 		{
 			yyValue = new AccDeviceTypeListClause(list);
 		}
@@ -761,7 +758,7 @@ AccVectorLengthClause acc_vector_length_clause =
 
 //// AccSelfClause:AccClause ::= Variable* ;
 AccSelfClause acc_self_clause =
-	A_SELF LPAREN list:var_list RPAREN
+	A_SELF list:p_var_list
 		{
 			yyValue = new AccSelfClause(list);
 		}
@@ -769,7 +766,7 @@ AccSelfClause acc_self_clause =
 
 //// AccHostClause:AccClause ::= Variable* ;
 AccHostClause acc_host_clause =
-	A_HOST LPAREN list:var_list RPAREN
+	A_HOST list:p_var_list
 		{
 			yyValue = new AccHostClause(list);
 		}
@@ -846,7 +843,7 @@ AccVectorClause acc_vector_clause =
 
 //// AccDeviceResidentClause:AccClause ::= Variable* ;
 AccDeviceResidentClause acc_device_resident_clause =
-	A_DEVICE_RESIDENT LPAREN list:var_list RPAREN
+	A_DEVICE_RESIDENT list:p_var_list
 		{
 			yyValue = new AccDeviceResidentClause(list);
 		}
@@ -854,7 +851,7 @@ AccDeviceResidentClause acc_device_resident_clause =
 
 //// AccLinkClause:AccClause ::= Variable* ;
 AccLinkClause acc_link_clause =
-	A_LINK LPAREN list:var_list RPAREN
+	A_LINK list:p_var_list
 		{
 			yyValue = new AccLinkClause(list);
 		}
-- 
GitLab