1-  /* 
1+ /* 
22
33 Copyright (C) 2019. rollrat All Rights Reserved. 
44
1313
1414namespace  ParserGenerator 
1515{ 
16+  public  class  ParserAction 
17+  { 
18+  public  Action < ParsingTree . ParsingTreeNode >  SemanticAction ; 
19+  public  static ParserAction  Create ( Action < ParsingTree . ParsingTreeNode >  action ) 
20+  =>  new  ParserAction  {  SemanticAction  =  action  } ; 
21+  } 
22+ 1623 public  class  ParserProduction 
1724 { 
1825 public  int  index ; 
1926 public  string  production_name ; 
2027 public  bool  isterminal ; 
2128 public  List < ParserProduction >  contents  =  new  List < ParserProduction > ( ) ; 
2229 public  List < List < ParserProduction > >  sub_productions  =  new  List < List < ParserProduction > > ( ) ; 
30+  public  List < ParserAction >  temp_actions  =  new  List < ParserAction > ( ) ; 
31+  public  List < ParserAction >  actions  =  new  List < ParserAction > ( ) ; 
2332
2433 public  static ParserProduction  operator  + ( ParserProduction  p1 ,  ParserProduction  p2 ) 
2534 { 
2635 p1 . contents . Add ( p2 ) ; 
2736 return  p1 ; 
2837 } 
2938
39+  public  static ParserProduction  operator  + ( ParserProduction  pp ,  ParserAction  ac ) 
40+  { 
41+  pp . temp_actions . Add ( ac ) ; 
42+  return  pp ; 
43+  } 
44+ 3045 public  static ParserProduction  operator  | ( ParserProduction  p1 ,  ParserProduction  p2 ) 
3146 { 
3247 p2 . contents . Insert ( 0 ,  p2 ) ; 
3348 p1 . sub_productions . Add ( new  List < ParserProduction > ( p2 . contents ) ) ; 
49+  p1 . actions . AddRange ( p2 . temp_actions ) ; 
50+  p2 . temp_actions . Clear ( ) ; 
3451 p2 . contents . Clear ( ) ; 
3552 return  p1 ; 
3653 } 
@@ -1266,6 +1283,7 @@ public ShiftReduceParser CreateShiftReduceParserInstance()
12661283 var  grammar  =  new  List < List < int > > ( ) ; 
12671284 var  grammar_group  =  new  List < int > ( ) ; 
12681285 var  production_mapping  =  new  List < List < int > > ( ) ; 
1286+  var  semantic_rules  =  new  List < ParserAction > ( ) ; 
12691287 var  pm_count  =  0 ; 
12701288
12711289 foreach  ( var  pr  in  production_rules ) 
@@ -1280,6 +1298,7 @@ public ShiftReduceParser CreateShiftReduceParserInstance()
12801298 } 
12811299 grammar . AddRange ( ll ) ; 
12821300 production_mapping . Add ( pm ) ; 
1301+  semantic_rules . AddRange ( pr . actions ) ; 
12831302 } 
12841303
12851304 for  ( int  i  =  0 ;  i  <  number_of_states ;  i ++ ) 
@@ -1316,7 +1335,7 @@ public ShiftReduceParser CreateShiftReduceParserInstance()
13161335 } 
13171336 } 
13181337
1319-  return  new  ShiftReduceParser ( symbol_table ,  jump_table ,  goto_table ,  grammar_group . ToArray ( ) ,  grammar . Select ( x =>  x . ToArray ( ) ) . ToArray ( ) ) ; 
1338+  return  new  ShiftReduceParser ( symbol_table ,  jump_table ,  goto_table ,  grammar_group . ToArray ( ) ,  grammar . Select ( x =>  x . ToArray ( ) ) . ToArray ( ) , semantic_rules ) ; 
13201339 } 
13211340 } 
13221341
@@ -1339,7 +1358,7 @@ public static ParsingTreeNode NewNode(string production, string contents)
13391358 =>  new  ParsingTreeNode  {  Parent  =  null ,  Childs  =  new  List < ParsingTreeNode > ( ) ,  Produnction  =  production ,  Contents  =  contents  } ; 
13401359 } 
13411360
1342-  ParsingTreeNode  root ; 
1361+  public ParsingTreeNode  root ; 
13431362
13441363 public  ParsingTree ( ParsingTreeNode  root ) 
13451364 { 
@@ -1356,6 +1375,7 @@ public class ShiftReduceParser
13561375 List < string >  symbol_index_name  =  new  List < string > ( ) ; 
13571376 Stack < int >  state_stack  =  new  Stack < int > ( ) ; 
13581377 Stack < ParsingTree . ParsingTreeNode >  treenode_stack  =  new  Stack < ParsingTree . ParsingTreeNode > ( ) ; 
1378+  List < ParserAction >  actions ; 
13591379
13601380 // 3 1 2 0 
13611381 // Accept? Shift? Reduce? Error? 
@@ -1364,13 +1384,14 @@ public class ShiftReduceParser
13641384 int [ ] [ ]  production ; 
13651385 int [ ]  group_table ; 
13661386
1367-  public  ShiftReduceParser ( Dictionary < string ,  int >  symbol_table ,  int [ ] [ ]  jump_table ,  int [ ] [ ]  goto_table ,  int [ ]  group_table ,  int [ ] [ ]  production ) 
1387+  public  ShiftReduceParser ( Dictionary < string ,  int >  symbol_table ,  int [ ] [ ]  jump_table ,  int [ ] [ ]  goto_table ,  int [ ]  group_table ,  int [ ] [ ]  production , List < ParserAction > actions ) 
13681388 { 
13691389 symbol_name_index  =  symbol_table ; 
13701390 this . jump_table  =  jump_table ; 
13711391 this . goto_table  =  goto_table ; 
13721392 this . production  =  production ; 
13731393 this . group_table  =  group_table ; 
1394+  this . actions  =  actions ; 
13741395 var  l  =  symbol_table . ToList ( ) . Select ( x =>  new  Tuple < int ,  string > ( x . Value ,  x . Key ) ) . ToList ( ) ; 
13751396 l . Sort ( ) ; 
13761397 l . ForEach ( x =>  symbol_index_name . Add ( x . Item2 ) ) ; 
@@ -1451,6 +1472,7 @@ private void reduce(int index)
14511472 reduction_parent . Contents  =  string . Join ( "" ,  reduce_treenodes . Select ( x =>  x . Contents ) ) ; 
14521473 reduction_parent . Childs  =  reduce_treenodes ; 
14531474 treenode_stack . Push ( reduction_parent ) ; 
1475+  actions [ reduction_parent . ProductionRuleIndex ] . SemanticAction ( reduction_parent ) ; 
14541476 } 
14551477 } 
1456- } 
1478+ } 
0 commit comments