provider.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /*
  2. * ECAL
  3. *
  4. * Copyright 2020 Matthias Ladkau. All rights reserved.
  5. *
  6. * This Source Code Form is subject to the terms of the MIT
  7. * License, If a copy of the MIT License was not distributed with this
  8. * file, You can obtain one at https://opensource.org/licenses/MIT.
  9. */
  10. // TODO:
  11. // Import resolve
  12. // Event function: event
  13. // Context supporting final
  14. // Event handling
  15. package interpreter
  16. import (
  17. "devt.de/krotik/ecal/parser"
  18. "devt.de/krotik/ecal/util"
  19. )
  20. /*
  21. ecalRuntimeNew is used to instantiate ECAL runtime components.
  22. */
  23. type ecalRuntimeNew func(*ECALRuntimeProvider, *parser.ASTNode) parser.Runtime
  24. /*
  25. providerMap contains the mapping of AST nodes to runtime components for ECAL ASTs.
  26. */
  27. var providerMap = map[string]ecalRuntimeNew{
  28. parser.NodeEOF: invalidRuntimeInst,
  29. parser.NodeSTRING: stringValueRuntimeInst, // String constant
  30. parser.NodeNUMBER: numberValueRuntimeInst, // Number constant
  31. parser.NodeIDENTIFIER: identifierRuntimeInst, // Idendifier
  32. // Constructed tokens
  33. parser.NodeSTATEMENTS: statementsRuntimeInst, // List of statements
  34. parser.NodeFUNCCALL: voidRuntimeInst, // Function call
  35. parser.NodeCOMPACCESS: voidRuntimeInst, // Composition structure access
  36. parser.NodeLIST: listValueRuntimeInst, // List value
  37. parser.NodeMAP: mapValueRuntimeInst, // Map value
  38. parser.NodePARAMS: voidRuntimeInst, // Function parameters
  39. parser.NodeGUARD: guardRuntimeInst, // Guard expressions for conditional statements
  40. // Condition operators
  41. parser.NodeGEQ: greaterequalOpRuntimeInst,
  42. parser.NodeLEQ: lessequalOpRuntimeInst,
  43. parser.NodeNEQ: notequalOpRuntimeInst,
  44. parser.NodeEQ: equalOpRuntimeInst,
  45. parser.NodeGT: greaterOpRuntimeInst,
  46. parser.NodeLT: lessOpRuntimeInst,
  47. // Separators
  48. parser.NodeKVP: voidRuntimeInst, // Key-value pair
  49. parser.NodePRESET: voidRuntimeInst, // Preset value
  50. // Arithmetic operators
  51. parser.NodePLUS: plusOpRuntimeInst,
  52. parser.NodeMINUS: minusOpRuntimeInst,
  53. parser.NodeTIMES: timesOpRuntimeInst,
  54. parser.NodeDIV: divOpRuntimeInst,
  55. parser.NodeMODINT: modintOpRuntimeInst,
  56. parser.NodeDIVINT: divintOpRuntimeInst,
  57. // Assignment statement
  58. parser.NodeASSIGN: assignmentRuntimeInst,
  59. /*
  60. // Import statement
  61. parser.NodeIMPORT
  62. // Sink definition
  63. parser.NodeSINK
  64. parser.NodeKINDMATCH
  65. parser.NodeSCOPEMATCH
  66. parser.NodeSTATEMATCH
  67. parser.NodePRIORITY
  68. parser.NodeSUPPRESSES
  69. */
  70. // Function definition
  71. parser.NodeFUNC: funcRuntimeInst,
  72. parser.NodeRETURN: returnRuntimeInst,
  73. // Boolean operators
  74. parser.NodeOR: orOpRuntimeInst,
  75. parser.NodeAND: andOpRuntimeInst,
  76. parser.NodeNOT: notOpRuntimeInst,
  77. // Condition operators
  78. parser.NodeLIKE: likeOpRuntimeInst,
  79. parser.NodeIN: inOpRuntimeInst,
  80. parser.NodeHASPREFIX: beginswithOpRuntimeInst,
  81. parser.NodeHASSUFFIX: endswithOpRuntimeInst,
  82. parser.NodeNOTIN: notinOpRuntimeInst,
  83. // Constant terminals
  84. parser.NodeFALSE: falseRuntimeInst,
  85. parser.NodeTRUE: trueRuntimeInst,
  86. parser.NodeNULL: nullRuntimeInst,
  87. // Conditional statements
  88. parser.NodeIF: ifRuntimeInst,
  89. // Loop statements
  90. parser.NodeLOOP: loopRuntimeInst,
  91. parser.NodeBREAK: breakRuntimeInst,
  92. parser.NodeCONTINUE: continueRuntimeInst,
  93. }
  94. /*
  95. ECALRuntimeProvider is the factory object producing runtime objects for ECAL ASTs.
  96. */
  97. type ECALRuntimeProvider struct {
  98. Name string // Name to identify the input
  99. }
  100. /*
  101. NewECALRuntimeProvider returns a new instance of a ECAL runtime provider.
  102. */
  103. func NewECALRuntimeProvider(name string) *ECALRuntimeProvider {
  104. return &ECALRuntimeProvider{name}
  105. }
  106. /*
  107. Runtime returns a runtime component for a given ASTNode.
  108. */
  109. func (erp *ECALRuntimeProvider) Runtime(node *parser.ASTNode) parser.Runtime {
  110. if instFunc, ok := providerMap[node.Name]; ok {
  111. return instFunc(erp, node)
  112. }
  113. return invalidRuntimeInst(erp, node)
  114. }
  115. /*
  116. NewRuntimeError creates a new RuntimeError object.
  117. */
  118. func (erp *ECALRuntimeProvider) NewRuntimeError(t error, d string, node *parser.ASTNode) error {
  119. return util.NewRuntimeError(erp.Name, t, d, node)
  120. }