bel_parser 1.0.0.alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gemspec +28 -0
- data/CHANGELOG.md +10 -0
- data/LICENSE +191 -0
- data/README.md +9 -0
- data/VERSION +1 -0
- data/bin/bel2_termcheck +39 -0
- data/lib/bel_parser.rb +17 -0
- data/lib/bel_parser/ast_filter.rb +27 -0
- data/lib/bel_parser/ast_generator.rb +86 -0
- data/lib/bel_parser/ast_validator.rb +40 -0
- data/lib/bel_parser/expression/parser.rb +42 -0
- data/lib/bel_parser/expression/term_semantics.rb +36 -0
- data/lib/bel_parser/language.rb +7 -0
- data/lib/bel_parser/language/function.rb +59 -0
- data/lib/bel_parser/language/quoting.rb +236 -0
- data/lib/bel_parser/language/semantic_ast.rb +604 -0
- data/lib/bel_parser/language/semantics/analyzer.rb +59 -0
- data/lib/bel_parser/language/signature.rb +39 -0
- data/lib/bel_parser/language/specification.rb +49 -0
- data/lib/bel_parser/language/syntax/expression/incomplete_node.rb +14 -0
- data/lib/bel_parser/language/syntax/expression/invalid_term_function.rb +22 -0
- data/lib/bel_parser/language/version1.rb +50 -0
- data/lib/bel_parser/language/version1/functions/abundance.rb +85 -0
- data/lib/bel_parser/language/version1/functions/biological_process.rb +85 -0
- data/lib/bel_parser/language/version1/functions/catalytic_activity.rb +110 -0
- data/lib/bel_parser/language/version1/functions/cell_secretion.rb +80 -0
- data/lib/bel_parser/language/version1/functions/cell_surface_expression.rb +80 -0
- data/lib/bel_parser/language/version1/functions/chaperone_activity.rb +110 -0
- data/lib/bel_parser/language/version1/functions/complex_abundance.rb +115 -0
- data/lib/bel_parser/language/version1/functions/composite_abundance.rb +80 -0
- data/lib/bel_parser/language/version1/functions/degradation.rb +80 -0
- data/lib/bel_parser/language/version1/functions/fusion.rb +302 -0
- data/lib/bel_parser/language/version1/functions/gene_abundance.rb +125 -0
- data/lib/bel_parser/language/version1/functions/gtp_bound_activity.rb +110 -0
- data/lib/bel_parser/language/version1/functions/kinase_activity.rb +110 -0
- data/lib/bel_parser/language/version1/functions/list.rb +115 -0
- data/lib/bel_parser/language/version1/functions/micro_rna_abundance.rb +85 -0
- data/lib/bel_parser/language/version1/functions/molecular_activity.rb +80 -0
- data/lib/bel_parser/language/version1/functions/pathology.rb +85 -0
- data/lib/bel_parser/language/version1/functions/peptidase_activity.rb +110 -0
- data/lib/bel_parser/language/version1/functions/phosphatase_activity.rb +110 -0
- data/lib/bel_parser/language/version1/functions/products.rb +80 -0
- data/lib/bel_parser/language/version1/functions/protein_abundance.rb +245 -0
- data/lib/bel_parser/language/version1/functions/protein_modification.rb +167 -0
- data/lib/bel_parser/language/version1/functions/reactants.rb +80 -0
- data/lib/bel_parser/language/version1/functions/reaction.rb +85 -0
- data/lib/bel_parser/language/version1/functions/ribosylation_activity.rb +110 -0
- data/lib/bel_parser/language/version1/functions/rna_abundance.rb +125 -0
- data/lib/bel_parser/language/version1/functions/substitution.rb +96 -0
- data/lib/bel_parser/language/version1/functions/transcriptional_activity.rb +110 -0
- data/lib/bel_parser/language/version1/functions/translocation.rb +100 -0
- data/lib/bel_parser/language/version1/functions/transport_activity.rb +110 -0
- data/lib/bel_parser/language/version1/functions/truncation.rb +82 -0
- data/lib/bel_parser/language/version1/return_types/abundance.rb +20 -0
- data/lib/bel_parser/language/version1/return_types/any.rb +74 -0
- data/lib/bel_parser/language/version1/return_types/biological_process.rb +17 -0
- data/lib/bel_parser/language/version1/return_types/catalytic_activity.rb +20 -0
- data/lib/bel_parser/language/version1/return_types/chaperone_activity.rb +20 -0
- data/lib/bel_parser/language/version1/return_types/complex_abundance.rb +17 -0
- data/lib/bel_parser/language/version1/return_types/fusion.rb +17 -0
- data/lib/bel_parser/language/version1/return_types/gene_abundance.rb +17 -0
- data/lib/bel_parser/language/version1/return_types/gtp_bound_activity.rb +20 -0
- data/lib/bel_parser/language/version1/return_types/kinase_activity.rb +20 -0
- data/lib/bel_parser/language/version1/return_types/list.rb +17 -0
- data/lib/bel_parser/language/version1/return_types/micro_rna_abundance.rb +17 -0
- data/lib/bel_parser/language/version1/return_types/molecular_activity.rb +20 -0
- data/lib/bel_parser/language/version1/return_types/pathology.rb +17 -0
- data/lib/bel_parser/language/version1/return_types/peptidase_activity.rb +20 -0
- data/lib/bel_parser/language/version1/return_types/phosphatase_activity.rb +20 -0
- data/lib/bel_parser/language/version1/return_types/products.rb +17 -0
- data/lib/bel_parser/language/version1/return_types/protein_abundance.rb +17 -0
- data/lib/bel_parser/language/version1/return_types/protein_modification.rb +17 -0
- data/lib/bel_parser/language/version1/return_types/reactants.rb +17 -0
- data/lib/bel_parser/language/version1/return_types/ribosylation_activity.rb +20 -0
- data/lib/bel_parser/language/version1/return_types/rna_abundance.rb +17 -0
- data/lib/bel_parser/language/version1/return_types/substitution.rb +17 -0
- data/lib/bel_parser/language/version1/return_types/transcriptional_activity.rb +20 -0
- data/lib/bel_parser/language/version1/return_types/transport_activity.rb +20 -0
- data/lib/bel_parser/language/version1/return_types/truncation.rb +17 -0
- data/lib/bel_parser/language/version2.rb +50 -0
- data/lib/bel_parser/language/version2/functions/abundance.rb +165 -0
- data/lib/bel_parser/language/version2/functions/activity.rb +115 -0
- data/lib/bel_parser/language/version2/functions/biological_process.rb +85 -0
- data/lib/bel_parser/language/version2/functions/cell_secretion.rb +80 -0
- data/lib/bel_parser/language/version2/functions/cell_surface_expression.rb +80 -0
- data/lib/bel_parser/language/version2/functions/complex_abundance.rb +190 -0
- data/lib/bel_parser/language/version2/functions/composite_abundance.rb +80 -0
- data/lib/bel_parser/language/version2/functions/degradation.rb +80 -0
- data/lib/bel_parser/language/version2/functions/fragment.rb +119 -0
- data/lib/bel_parser/language/version2/functions/from_location.rb +85 -0
- data/lib/bel_parser/language/version2/functions/fusion.rb +227 -0
- data/lib/bel_parser/language/version2/functions/gene_abundance.rb +195 -0
- data/lib/bel_parser/language/version2/functions/list.rb +115 -0
- data/lib/bel_parser/language/version2/functions/location.rb +85 -0
- data/lib/bel_parser/language/version2/functions/micro_rna_abundance.rb +165 -0
- data/lib/bel_parser/language/version2/functions/molecular_activity.rb +83 -0
- data/lib/bel_parser/language/version2/functions/pathology.rb +85 -0
- data/lib/bel_parser/language/version2/functions/products.rb +80 -0
- data/lib/bel_parser/language/version2/functions/protein_abundance.rb +285 -0
- data/lib/bel_parser/language/version2/functions/protein_modification.rb +167 -0
- data/lib/bel_parser/language/version2/functions/reactants.rb +80 -0
- data/lib/bel_parser/language/version2/functions/reaction.rb +85 -0
- data/lib/bel_parser/language/version2/functions/rna_abundance.rb +195 -0
- data/lib/bel_parser/language/version2/functions/to_location.rb +85 -0
- data/lib/bel_parser/language/version2/functions/translocation.rb +90 -0
- data/lib/bel_parser/language/version2/functions/variant.rb +83 -0
- data/lib/bel_parser/language/version2/return_types/abundance.rb +20 -0
- data/lib/bel_parser/language/version2/return_types/activity.rb +20 -0
- data/lib/bel_parser/language/version2/return_types/any.rb +74 -0
- data/lib/bel_parser/language/version2/return_types/biological_process.rb +17 -0
- data/lib/bel_parser/language/version2/return_types/complex_abundance.rb +17 -0
- data/lib/bel_parser/language/version2/return_types/fragment.rb +20 -0
- data/lib/bel_parser/language/version2/return_types/from_location.rb +20 -0
- data/lib/bel_parser/language/version2/return_types/fusion.rb +17 -0
- data/lib/bel_parser/language/version2/return_types/gene_abundance.rb +17 -0
- data/lib/bel_parser/language/version2/return_types/list.rb +17 -0
- data/lib/bel_parser/language/version2/return_types/location.rb +20 -0
- data/lib/bel_parser/language/version2/return_types/micro_rna_abundance.rb +17 -0
- data/lib/bel_parser/language/version2/return_types/molecular_activity.rb +20 -0
- data/lib/bel_parser/language/version2/return_types/pathology.rb +17 -0
- data/lib/bel_parser/language/version2/return_types/products.rb +17 -0
- data/lib/bel_parser/language/version2/return_types/protein_abundance.rb +17 -0
- data/lib/bel_parser/language/version2/return_types/protein_modification.rb +17 -0
- data/lib/bel_parser/language/version2/return_types/reactants.rb +17 -0
- data/lib/bel_parser/language/version2/return_types/rna_abundance.rb +17 -0
- data/lib/bel_parser/language/version2/return_types/to_location.rb +20 -0
- data/lib/bel_parser/language/version2/return_types/variant.rb +20 -0
- data/lib/bel_parser/mixin/line_continuator.rb +15 -0
- data/lib/bel_parser/mixin/line_mapping.rb +14 -0
- data/lib/bel_parser/parser.rb +54 -0
- data/lib/bel_parser/parsers/ast/mapped_traversal.rb +36 -0
- data/lib/bel_parser/parsers/ast/node.rb +705 -0
- data/lib/bel_parser/parsers/ast/sexp.rb +8 -0
- data/lib/bel_parser/parsers/ast/traversal.rb +21 -0
- data/lib/bel_parser/parsers/bel_script.rb +4 -0
- data/lib/bel_parser/parsers/bel_script/define_annotation.rb +5476 -0
- data/lib/bel_parser/parsers/bel_script/define_annotation.rl +141 -0
- data/lib/bel_parser/parsers/bel_script/define_namespace.rb +1780 -0
- data/lib/bel_parser/parsers/bel_script/define_namespace.rl +121 -0
- data/lib/bel_parser/parsers/bel_script/set.rb +4556 -0
- data/lib/bel_parser/parsers/bel_script/set.rl +116 -0
- data/lib/bel_parser/parsers/bel_script/unset.rb +706 -0
- data/lib/bel_parser/parsers/bel_script/unset.rl +95 -0
- data/lib/bel_parser/parsers/common.rb +5 -0
- data/lib/bel_parser/parsers/common/blank_line.rb +211 -0
- data/lib/bel_parser/parsers/common/blank_line.rl +81 -0
- data/lib/bel_parser/parsers/common/comment_line.rb +245 -0
- data/lib/bel_parser/parsers/common/comment_line.rl +97 -0
- data/lib/bel_parser/parsers/common/common.rb +7 -0
- data/lib/bel_parser/parsers/common/common.rl +13 -0
- data/lib/bel_parser/parsers/common/identifier.rb +289 -0
- data/lib/bel_parser/parsers/common/identifier.rl +106 -0
- data/lib/bel_parser/parsers/common/list.rb +2142 -0
- data/lib/bel_parser/parsers/common/list.rl +144 -0
- data/lib/bel_parser/parsers/common/string.rb +271 -0
- data/lib/bel_parser/parsers/common/string.rl +107 -0
- data/lib/bel_parser/parsers/expression.rb +7 -0
- data/lib/bel_parser/parsers/expression/comment.rb +239 -0
- data/lib/bel_parser/parsers/expression/comment.rl +97 -0
- data/lib/bel_parser/parsers/expression/parameter.rb +1506 -0
- data/lib/bel_parser/parsers/expression/parameter.rl +97 -0
- data/lib/bel_parser/parsers/expression/relationship.rb +254 -0
- data/lib/bel_parser/parsers/expression/relationship.rl +98 -0
- data/lib/bel_parser/parsers/expression/statement_nested.rb +17802 -0
- data/lib/bel_parser/parsers/expression/statement_nested.rl +141 -0
- data/lib/bel_parser/parsers/expression/statement_observed_term.rb +7291 -0
- data/lib/bel_parser/parsers/expression/statement_observed_term.rl +92 -0
- data/lib/bel_parser/parsers/expression/statement_simple.rb +10475 -0
- data/lib/bel_parser/parsers/expression/statement_simple.rl +112 -0
- data/lib/bel_parser/parsers/expression/term.rb +3989 -0
- data/lib/bel_parser/parsers/expression/term.rl +157 -0
- data/lib/bel_parser/parsers/line_parser.rb +92 -0
- data/lib/bel_parser/parsers/mixin/buffer.rb +10 -0
- data/lib/bel_parser/parsers/nonblocking_io_wrapper.rb +50 -0
- data/lib/bel_parser/script/parser.rb +49 -0
- data/lib/bel_parser/vendor/ast.rb +17 -0
- data/lib/bel_parser/vendor/ast/node.rb +254 -0
- data/lib/bel_parser/vendor/ast/processor.rb +12 -0
- data/lib/bel_parser/vendor/ast/processor/mixin.rb +282 -0
- data/lib/bel_parser/vendor/ast/sexp.rb +30 -0
- metadata +226 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require_relative 'any'
|
|
2
|
+
|
|
3
|
+
module BELParser
|
|
4
|
+
module Language
|
|
5
|
+
module Version2
|
|
6
|
+
module ReturnTypes
|
|
7
|
+
# Fusion return type.
|
|
8
|
+
class Fusion < Any
|
|
9
|
+
def self.to_sym
|
|
10
|
+
raise_not_implemented(__method__) if self != Fusion
|
|
11
|
+
:fusion
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require_relative 'abundance'
|
|
2
|
+
|
|
3
|
+
module BELParser
|
|
4
|
+
module Language
|
|
5
|
+
module Version2
|
|
6
|
+
module ReturnTypes
|
|
7
|
+
# Gene abundance return type.
|
|
8
|
+
class GeneAbundance < Abundance
|
|
9
|
+
def self.to_sym
|
|
10
|
+
raise_not_implemented(__method__) if self != GeneAbundance
|
|
11
|
+
:geneAbundance
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require_relative 'any'
|
|
2
|
+
|
|
3
|
+
module BELParser
|
|
4
|
+
module Language
|
|
5
|
+
module Version2
|
|
6
|
+
module ReturnTypes
|
|
7
|
+
# List return type.
|
|
8
|
+
class List < Any
|
|
9
|
+
def self.to_sym
|
|
10
|
+
raise_not_implemented(__method__) if self != List
|
|
11
|
+
:list
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require_relative 'any'
|
|
2
|
+
|
|
3
|
+
module BELParser
|
|
4
|
+
module Language
|
|
5
|
+
module Version2
|
|
6
|
+
module ReturnTypes
|
|
7
|
+
# Location return type.
|
|
8
|
+
class Location < Any
|
|
9
|
+
# Return the {Symbol} value.
|
|
10
|
+
#
|
|
11
|
+
# @note This method should be overridden in subclasses.
|
|
12
|
+
def self.to_sym
|
|
13
|
+
raise_not_implemented(__method__) if self != Location
|
|
14
|
+
:location
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require_relative 'abundance'
|
|
2
|
+
|
|
3
|
+
module BELParser
|
|
4
|
+
module Language
|
|
5
|
+
module Version2
|
|
6
|
+
module ReturnTypes
|
|
7
|
+
# Micro RNA abundance return type.
|
|
8
|
+
class MicroRNAAbundance < Abundance
|
|
9
|
+
def self.to_sym
|
|
10
|
+
raise_not_implemented(__method__) if self != MicroRNAAbundance
|
|
11
|
+
:microRNAAbundance
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require_relative 'any'
|
|
2
|
+
|
|
3
|
+
module BELParser
|
|
4
|
+
module Language
|
|
5
|
+
module Version2
|
|
6
|
+
module ReturnTypes
|
|
7
|
+
# MolecularActivity return type.
|
|
8
|
+
class MolecularActivity < Any
|
|
9
|
+
# Return the {Symbol} value.
|
|
10
|
+
#
|
|
11
|
+
# @note This method should be overridden in subclasses.
|
|
12
|
+
def self.to_sym
|
|
13
|
+
raise_not_implemented(__method__) if self != MolecularActivity
|
|
14
|
+
:molecularActivity
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require_relative 'biological_process'
|
|
2
|
+
|
|
3
|
+
module BELParser
|
|
4
|
+
module Language
|
|
5
|
+
module Version2
|
|
6
|
+
module ReturnTypes
|
|
7
|
+
# Pathology return type.
|
|
8
|
+
class Pathology < BiologicalProcess
|
|
9
|
+
def self.to_sym
|
|
10
|
+
raise_not_implemented(__method__) if self != Pathology
|
|
11
|
+
:pathology
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require_relative 'any'
|
|
2
|
+
|
|
3
|
+
module BELParser
|
|
4
|
+
module Language
|
|
5
|
+
module Version2
|
|
6
|
+
module ReturnTypes
|
|
7
|
+
# Products return type.
|
|
8
|
+
class Products < Any
|
|
9
|
+
def self.to_sym
|
|
10
|
+
raise_not_implemented(__method__) if self != Products
|
|
11
|
+
:products
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require_relative 'abundance'
|
|
2
|
+
|
|
3
|
+
module BELParser
|
|
4
|
+
module Language
|
|
5
|
+
module Version2
|
|
6
|
+
module ReturnTypes
|
|
7
|
+
# Protein abundance return type.
|
|
8
|
+
class ProteinAbundance < Abundance
|
|
9
|
+
def self.to_sym
|
|
10
|
+
raise_not_implemented(__method__) if self != ProteinAbundance
|
|
11
|
+
:proteinAbundance
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require_relative 'any'
|
|
2
|
+
|
|
3
|
+
module BELParser
|
|
4
|
+
module Language
|
|
5
|
+
module Version2
|
|
6
|
+
module ReturnTypes
|
|
7
|
+
# Protein modification return type.
|
|
8
|
+
class ProteinModification < Any
|
|
9
|
+
def self.to_sym
|
|
10
|
+
raise_not_implemented(__method__) if self != ProteinModification
|
|
11
|
+
:proteinModification
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require_relative 'any'
|
|
2
|
+
|
|
3
|
+
module BELParser
|
|
4
|
+
module Language
|
|
5
|
+
module Version2
|
|
6
|
+
module ReturnTypes
|
|
7
|
+
# Reactants return type.
|
|
8
|
+
class Reactants < Any
|
|
9
|
+
def self.to_sym
|
|
10
|
+
raise_not_implemented(__method__) if self != Reactants
|
|
11
|
+
:reactants
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require_relative 'abundance'
|
|
2
|
+
|
|
3
|
+
module BELParser
|
|
4
|
+
module Language
|
|
5
|
+
module Version2
|
|
6
|
+
module ReturnTypes
|
|
7
|
+
# RNA abundance return type.
|
|
8
|
+
class RNAAbundance < Abundance
|
|
9
|
+
def self.to_sym
|
|
10
|
+
raise_not_implemented(__method__) if self != RNAAbundance
|
|
11
|
+
:rnaAbundance
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require_relative 'location'
|
|
2
|
+
|
|
3
|
+
module BELParser
|
|
4
|
+
module Language
|
|
5
|
+
module Version2
|
|
6
|
+
module ReturnTypes
|
|
7
|
+
# ToLocation return type.
|
|
8
|
+
class ToLocation < Location
|
|
9
|
+
# Return the {Symbol} value.
|
|
10
|
+
#
|
|
11
|
+
# @note This method should be overridden in subclasses.
|
|
12
|
+
def self.to_sym
|
|
13
|
+
raise_not_implemented(__method__) if self != ToLocation
|
|
14
|
+
:toLocation
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require_relative 'any'
|
|
2
|
+
|
|
3
|
+
module BELParser
|
|
4
|
+
module Language
|
|
5
|
+
module Version2
|
|
6
|
+
module ReturnTypes
|
|
7
|
+
# Variant return type.
|
|
8
|
+
class Variant < Any
|
|
9
|
+
# Return the {Symbol} value.
|
|
10
|
+
#
|
|
11
|
+
# @note This method should be overridden in subclasses.
|
|
12
|
+
def self.to_sym
|
|
13
|
+
raise_not_implemented(__method__) if self != Variant
|
|
14
|
+
:variant
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module BELParser
|
|
2
|
+
# LineContinuator is a mixin for line expansions for BEL Script.
|
|
3
|
+
module LineContinuator
|
|
4
|
+
LINE_CONTINUATOR = "\\\n".freeze
|
|
5
|
+
|
|
6
|
+
def expand_line_continuator(line_enumerator)
|
|
7
|
+
line = line_enumerator.next
|
|
8
|
+
while line.end_with?(LINE_CONTINUATOR)
|
|
9
|
+
line.chomp!(LINE_CONTINUATOR)
|
|
10
|
+
line += line_enumerator.next
|
|
11
|
+
end
|
|
12
|
+
line
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module BELParser
|
|
2
|
+
# LineMapping module.
|
|
3
|
+
module LineMapping
|
|
4
|
+
def normalize_line_terminator(line)
|
|
5
|
+
return nil unless line
|
|
6
|
+
line.sub(/[\r\n]+$/, '') + "\n"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def map_lines(line_enumerator)
|
|
10
|
+
line_enumerator
|
|
11
|
+
.map { |line| normalize_line_terminator(line) }
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require_relative 'ast_filter'
|
|
2
|
+
require_relative 'ast_generator'
|
|
3
|
+
require_relative 'parsers/common'
|
|
4
|
+
require_relative 'parsers/expression'
|
|
5
|
+
require_relative 'parsers/bel_script'
|
|
6
|
+
|
|
7
|
+
module BELParser
|
|
8
|
+
# Parser is a line parser that supports recognition using all ragel parsers.
|
|
9
|
+
class Parser
|
|
10
|
+
include BELParser::Parsers::Common
|
|
11
|
+
include BELParser::Parsers::Expression
|
|
12
|
+
include BELParser::Parsers::BELScript
|
|
13
|
+
|
|
14
|
+
FILTER = BELParser::ASTFilter.new(
|
|
15
|
+
:blank_line,
|
|
16
|
+
:comment_line,
|
|
17
|
+
:identifier,
|
|
18
|
+
:string,
|
|
19
|
+
:list,
|
|
20
|
+
:comment,
|
|
21
|
+
:parameter,
|
|
22
|
+
:term,
|
|
23
|
+
:relationship,
|
|
24
|
+
:observed_term,
|
|
25
|
+
:statement_simple,
|
|
26
|
+
:nested_statement,
|
|
27
|
+
:define_annotation,
|
|
28
|
+
:define_namespace,
|
|
29
|
+
:set,
|
|
30
|
+
:unset
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
def each(io)
|
|
34
|
+
if block_given?
|
|
35
|
+
filtered_ast = FILTER.each(BELParser::ASTGenerator.new.each(io))
|
|
36
|
+
filtered_ast.each do |results|
|
|
37
|
+
yield results
|
|
38
|
+
end
|
|
39
|
+
else
|
|
40
|
+
enum_for(:each, io)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
if __FILE__ == $PROGRAM_NAME
|
|
47
|
+
BELParser::Parser.new.each($stdin) do |line_result|
|
|
48
|
+
line_number, line, ast_results = line_result
|
|
49
|
+
puts "#{line_number}: #{line}"
|
|
50
|
+
ast_results.each do |ast|
|
|
51
|
+
puts ast.to_s(1)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require 'observer'
|
|
2
|
+
|
|
3
|
+
module BELParser
|
|
4
|
+
module Parsers
|
|
5
|
+
module AST
|
|
6
|
+
# Traversal provides an observable walk that maps over the
|
|
7
|
+
# {BELParser::Parsers::AST::Node AST node} and returns the results.
|
|
8
|
+
# Alternatively, see {BELParser::Parsers::AST::Traversal}.
|
|
9
|
+
class MappedTraversal
|
|
10
|
+
include Observable
|
|
11
|
+
|
|
12
|
+
def traverse(ast)
|
|
13
|
+
if block_given?
|
|
14
|
+
ast.traverse do |node|
|
|
15
|
+
changed
|
|
16
|
+
yield(node, notify_observers(node))
|
|
17
|
+
end
|
|
18
|
+
else
|
|
19
|
+
enum_for(:traverse, ast)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def notify_observers(*args)
|
|
24
|
+
if defined? @observer_state && @observer_state
|
|
25
|
+
@observer_state = false
|
|
26
|
+
if defined? @observer_peers
|
|
27
|
+
@observer_peers.map do |k, v|
|
|
28
|
+
k.send v, *args
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,705 @@
|
|
|
1
|
+
require 'bel_parser/vendor/ast'
|
|
2
|
+
|
|
3
|
+
module BELParser
|
|
4
|
+
module Parsers
|
|
5
|
+
# BEL AST module.
|
|
6
|
+
module AST
|
|
7
|
+
# @raise ArgumentError if _argument_ is not _expected_
|
|
8
|
+
def self.assert_is_a(expected, actual, argument)
|
|
9
|
+
msg = ->(x, y, z) { "Expected #{x} of #{y}, but got #{z}" }
|
|
10
|
+
return if actual.is_a? expected
|
|
11
|
+
raise ArgumentError, msg.call(expected, argument, actual.class)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# BEL application-specific AST node.
|
|
15
|
+
#
|
|
16
|
+
# All BEL AST nodes have a basic set of properties. Additional properties
|
|
17
|
+
# may be specified by subclasses. Each class in the hierarchy describes
|
|
18
|
+
# its type through the class variable _ast_type_. This is equivalent to
|
|
19
|
+
# its _type_ instance variable but the former is not used by the AST
|
|
20
|
+
# library itself.
|
|
21
|
+
#
|
|
22
|
+
# @see Node.ast_type
|
|
23
|
+
# @see Node.initialize
|
|
24
|
+
#
|
|
25
|
+
class Node < ::AST::Node
|
|
26
|
+
# AST node type
|
|
27
|
+
@ast_type = :node
|
|
28
|
+
# Basic AST node has no meaning
|
|
29
|
+
@has_semantics = false
|
|
30
|
+
|
|
31
|
+
# New BEL AST node.
|
|
32
|
+
#
|
|
33
|
+
# @param [Symbol] type The node type symbol
|
|
34
|
+
# @param [Array] children Optional children of node
|
|
35
|
+
# @param [Hash] properties Optional supported node properties
|
|
36
|
+
#
|
|
37
|
+
# === Supported properties
|
|
38
|
+
# - +line_number+ -> {#line_number}
|
|
39
|
+
# - +character_range+ -> {#character_range}, {#range_start},
|
|
40
|
+
# {#range_end}
|
|
41
|
+
# - +complete+ -> {#complete?}
|
|
42
|
+
#
|
|
43
|
+
# @raise ArgumentError If _children_ is not an Array or _properties_
|
|
44
|
+
# is not a Hash
|
|
45
|
+
def initialize(type, children = [], properties = {})
|
|
46
|
+
AST.assert_is_a(Array, children, 'children')
|
|
47
|
+
AST.assert_is_a(Hash, properties, 'properties')
|
|
48
|
+
super(type, children, properties)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Get the class AST node type.
|
|
52
|
+
# @return [Symbol]
|
|
53
|
+
class << self; attr_reader :ast_type end
|
|
54
|
+
|
|
55
|
+
# Get whether this class AST node has semantics.
|
|
56
|
+
# @return [boolean]
|
|
57
|
+
class << self; attr_reader :has_semantics end
|
|
58
|
+
|
|
59
|
+
# Get the line number where this AST node originates.
|
|
60
|
+
attr_reader :line_number
|
|
61
|
+
|
|
62
|
+
# Get the character range enclosing this AST node.
|
|
63
|
+
# It is defined as the close interval containing all the characters
|
|
64
|
+
# of this AST node.
|
|
65
|
+
attr_reader :character_range
|
|
66
|
+
|
|
67
|
+
# Get the start of the character range enclosing this AST node.
|
|
68
|
+
def range_start
|
|
69
|
+
@character_range[0]
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Get _a_ in the character range [a, b].
|
|
73
|
+
alias range_a range_start
|
|
74
|
+
|
|
75
|
+
# Get the end of the character range enclosing this AST node.
|
|
76
|
+
def range_end
|
|
77
|
+
@character_range[1]
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Get _b_ in the character range [a, b].
|
|
81
|
+
alias range_b range_end
|
|
82
|
+
|
|
83
|
+
# Get whether the AST node can be considered _complete_.
|
|
84
|
+
def complete?
|
|
85
|
+
@complete
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Get whether the AST node should be considered _incomplete_.
|
|
89
|
+
def incomplete?
|
|
90
|
+
!@complete
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def traverse(&block)
|
|
94
|
+
if block_given?
|
|
95
|
+
children.each do |child_node|
|
|
96
|
+
child_node.traverse(&block) if child_node.respond_to?(:traverse)
|
|
97
|
+
end
|
|
98
|
+
yield self
|
|
99
|
+
else
|
|
100
|
+
enum_for(:traverse)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def freeze
|
|
105
|
+
# no freeze...nothing
|
|
106
|
+
# I want to be able to modify properties!
|
|
107
|
+
self
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def updated(children = nil, properties = nil)
|
|
111
|
+
new_children = children || @children
|
|
112
|
+
new_properties = properties || {}
|
|
113
|
+
|
|
114
|
+
if @children == new_children && properties.nil?
|
|
115
|
+
self
|
|
116
|
+
else
|
|
117
|
+
original_dup.send :initialize, new_children, new_properties
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Concatenates `array` with `children` and returns the resulting node.
|
|
122
|
+
#
|
|
123
|
+
# @return [Node]
|
|
124
|
+
def concat(array)
|
|
125
|
+
updated(@children + array.to_a)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
alias + concat
|
|
129
|
+
|
|
130
|
+
# Appends `element` to `children` and returns the resulting node.
|
|
131
|
+
#
|
|
132
|
+
# @return [Node]
|
|
133
|
+
def append(element)
|
|
134
|
+
updated(@children + [element])
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
alias << append
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# AST node representing a blank line.
|
|
141
|
+
class BlankLine < Node
|
|
142
|
+
# AST node type
|
|
143
|
+
@ast_type = :blank_line
|
|
144
|
+
# Blank lines have no meaning
|
|
145
|
+
@has_semantics = false
|
|
146
|
+
|
|
147
|
+
# New BlankLine AST node.
|
|
148
|
+
#
|
|
149
|
+
# @see Node#initialize Node class for basic properties
|
|
150
|
+
def initialize(children = [], properties = {})
|
|
151
|
+
super(BlankLine.ast_type, children, properties)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# AST node representing a statement comment.
|
|
156
|
+
class Comment < Node
|
|
157
|
+
# AST node type
|
|
158
|
+
@ast_type = :comment
|
|
159
|
+
# Comments have no meaning
|
|
160
|
+
@has_semantics = false
|
|
161
|
+
|
|
162
|
+
# New Comment AST node.
|
|
163
|
+
#
|
|
164
|
+
# @see Node#initialize Node class for basic properties
|
|
165
|
+
def initialize(children = [], properties = {})
|
|
166
|
+
super(Comment.ast_type, children, properties)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# AST node representing a line comment.
|
|
171
|
+
class CommentLine < Node
|
|
172
|
+
# AST node type
|
|
173
|
+
@ast_type = :comment_line
|
|
174
|
+
# Comment lines have no meaning
|
|
175
|
+
@has_semantics = false
|
|
176
|
+
|
|
177
|
+
# New CommentLine AST node.
|
|
178
|
+
#
|
|
179
|
+
# @see Node#initialize Node class for basic properties
|
|
180
|
+
def initialize(children = [], properties = {})
|
|
181
|
+
super(CommentLine.ast_type, children, properties)
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# AST node representing the definition of an annotation.
|
|
186
|
+
class AnnotationDefinition < Node
|
|
187
|
+
# AST node type
|
|
188
|
+
@ast_type = :annotation_definition
|
|
189
|
+
# Content is has semantic meaning
|
|
190
|
+
@has_semantics = true
|
|
191
|
+
|
|
192
|
+
# New AnnotationDefinition AST node.
|
|
193
|
+
#
|
|
194
|
+
# @see Node#initialize Node class for basic properties
|
|
195
|
+
def initialize(children = [], properties = {})
|
|
196
|
+
super(AnnotationDefinition.ast_type, children, properties)
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# AST node representing the function of a BEL term.
|
|
201
|
+
#
|
|
202
|
+
# === Special node properties
|
|
203
|
+
# - _return_type_: {#return_type}
|
|
204
|
+
#
|
|
205
|
+
class Function < Node
|
|
206
|
+
# AST node type
|
|
207
|
+
@ast_type = :function
|
|
208
|
+
# Functions have semantic meaning
|
|
209
|
+
@has_semantics = true
|
|
210
|
+
|
|
211
|
+
# New Function AST node.
|
|
212
|
+
#
|
|
213
|
+
# @see Node#initialize Node class for basic properties
|
|
214
|
+
def initialize(children = [], properties = {})
|
|
215
|
+
super(Function.ast_type, children, properties)
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# Get the function's identifier.
|
|
219
|
+
def identifier
|
|
220
|
+
children[0]
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
# Get the return type property.
|
|
224
|
+
attr_reader :return_type
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# AST node representing the definition of a namespace.
|
|
228
|
+
class NamespaceDefinition < Node
|
|
229
|
+
# AST node type
|
|
230
|
+
@ast_type = :namespace_definition
|
|
231
|
+
# Namespace definitions have semantic meaning
|
|
232
|
+
@has_semantics = true
|
|
233
|
+
|
|
234
|
+
# New NamespaceDefinition AST node.
|
|
235
|
+
#
|
|
236
|
+
# @see Node#initialize Node class for basic properties
|
|
237
|
+
def initialize(children = [], properties = {})
|
|
238
|
+
super(NamespaceDefinition.ast_type, children, properties)
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
# Get the namespace definition's keyword.
|
|
242
|
+
def keyword
|
|
243
|
+
# TODO: access children for content
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
# AST node representing the definition of a namespace.
|
|
248
|
+
class Identifier < Node
|
|
249
|
+
# AST node type
|
|
250
|
+
@ast_type = :identifier
|
|
251
|
+
# Identifier have no semantics
|
|
252
|
+
@has_semantics = false
|
|
253
|
+
|
|
254
|
+
# New Identifier AST node.
|
|
255
|
+
#
|
|
256
|
+
# @see Node#initialize Node class for basic properties
|
|
257
|
+
def initialize(children = [], properties = {})
|
|
258
|
+
super(Identifier.ast_type, children, properties)
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
# Get the string literal.
|
|
262
|
+
def string_literal
|
|
263
|
+
children[0]
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
# AST node representing a list.
|
|
268
|
+
class List < Node
|
|
269
|
+
# AST node type
|
|
270
|
+
@ast_type = :list
|
|
271
|
+
# List have semantics (content is meaningful)
|
|
272
|
+
@has_semantics = true
|
|
273
|
+
|
|
274
|
+
# New List AST node.
|
|
275
|
+
#
|
|
276
|
+
# @see Node#initialize Node class for basic properties
|
|
277
|
+
def initialize(children = [], properties = {})
|
|
278
|
+
super(List.ast_type, children, properties)
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
# AST node representing an argument.
|
|
283
|
+
class Argument < Node
|
|
284
|
+
# AST node type
|
|
285
|
+
@ast_type = :argument
|
|
286
|
+
# Arguments have semantics (position is meaningful)
|
|
287
|
+
@has_semantics = true
|
|
288
|
+
|
|
289
|
+
# New Argument AST node.
|
|
290
|
+
#
|
|
291
|
+
# @see Node#initialize Node class for basic properties
|
|
292
|
+
def initialize(children = [], properties = {})
|
|
293
|
+
super(Argument.ast_type, children, properties)
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
# Does the argument have a {Parameter} child?
|
|
297
|
+
def has_parameter?
|
|
298
|
+
children[0].is_a?(Parameter)
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
# Does the argument have a {Term} child?
|
|
302
|
+
def has_term?
|
|
303
|
+
children[0].is_a?(Term)
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
# Get the {Parameter} or {Term} child.
|
|
307
|
+
def child
|
|
308
|
+
children[0]
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
# AST node representing a parameter.
|
|
313
|
+
class Prefix < Node
|
|
314
|
+
# AST node type
|
|
315
|
+
@ast_type = :prefix
|
|
316
|
+
# Prefix have semantics (indicates namespace)
|
|
317
|
+
@has_semantics = true
|
|
318
|
+
|
|
319
|
+
# New Prefix AST node.
|
|
320
|
+
#
|
|
321
|
+
# @see Node#initialize Node class for basic properties
|
|
322
|
+
def initialize(children = [], properties = {})
|
|
323
|
+
super(Prefix.ast_type, children, properties)
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
# Get the identifier for the prefix.
|
|
327
|
+
def identifier
|
|
328
|
+
children[0]
|
|
329
|
+
end
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
# AST node representing a parameter.
|
|
333
|
+
class Parameter < Node
|
|
334
|
+
# AST node type
|
|
335
|
+
@ast_type = :parameter
|
|
336
|
+
# Parameters have semantics (encodings, namespaces)
|
|
337
|
+
@has_semantics = true
|
|
338
|
+
|
|
339
|
+
# New Parameter AST node.
|
|
340
|
+
#
|
|
341
|
+
# @see Node#initialize Node class for basic properties
|
|
342
|
+
def initialize(children = [], properties = {})
|
|
343
|
+
super(Parameter.ast_type, children, properties)
|
|
344
|
+
end
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
# AST node representing a relationship.
|
|
348
|
+
class Relationship < Node
|
|
349
|
+
# AST node type
|
|
350
|
+
@ast_type = :relationship
|
|
351
|
+
# Relationship have no semantics, statements do
|
|
352
|
+
@has_semantics = false
|
|
353
|
+
|
|
354
|
+
# New Relationship AST node.
|
|
355
|
+
#
|
|
356
|
+
# @see Node#initialize Node class for basic properties
|
|
357
|
+
def initialize(children = [], properties = {})
|
|
358
|
+
super(Relationship.ast_type, children, properties)
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
# AST node representing a set.
|
|
363
|
+
class Set < Node
|
|
364
|
+
# AST node type
|
|
365
|
+
@ast_type = :set
|
|
366
|
+
# Set has semantics (what was set?)
|
|
367
|
+
@has_semantics = true
|
|
368
|
+
|
|
369
|
+
# New Set AST node.
|
|
370
|
+
#
|
|
371
|
+
# @see Node#initialize Node class for basic properties
|
|
372
|
+
def initialize(children = [], properties = {})
|
|
373
|
+
super(Set.ast_type, children, properties)
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
# Get what is being set.
|
|
377
|
+
def name
|
|
378
|
+
# TODO: access children for content
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
# Get the value of what is being set.
|
|
382
|
+
def value
|
|
383
|
+
# TODO: access children for content
|
|
384
|
+
end
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
# AST node representing a statement.
|
|
388
|
+
class Statement < Node
|
|
389
|
+
# AST node type
|
|
390
|
+
@ast_type = :statement
|
|
391
|
+
# Statements have semantics
|
|
392
|
+
@has_semantics = true
|
|
393
|
+
|
|
394
|
+
# New Statement AST node.
|
|
395
|
+
#
|
|
396
|
+
# @see Node#initialize Node class for basic properties
|
|
397
|
+
def initialize(children = [], properties = {})
|
|
398
|
+
super(Statement.ast_type, children, properties)
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
# Get the subject of the statement.
|
|
402
|
+
def subject
|
|
403
|
+
# TODO: access children for content
|
|
404
|
+
end
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
# AST node representing a nested statement.
|
|
408
|
+
class NestedStatement < Node
|
|
409
|
+
# AST node type
|
|
410
|
+
@ast_type = :nested_statement
|
|
411
|
+
# Nested statements have semantics
|
|
412
|
+
@has_semantics = true
|
|
413
|
+
|
|
414
|
+
# New NestedStatement AST node.
|
|
415
|
+
#
|
|
416
|
+
# @see Node#initialize Node class for basic properties
|
|
417
|
+
def initialize(children = [], properties = {})
|
|
418
|
+
super(NestedStatement.ast_type, children, properties)
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
# Get the relationship of the nested statement.
|
|
422
|
+
def relatitonship
|
|
423
|
+
# TODO: access children for content
|
|
424
|
+
end
|
|
425
|
+
|
|
426
|
+
# Get the object of the nested statement.
|
|
427
|
+
def object
|
|
428
|
+
# TODO: access children for content
|
|
429
|
+
end
|
|
430
|
+
end
|
|
431
|
+
|
|
432
|
+
# AST node representing a observed term statement.
|
|
433
|
+
class ObservedTerm < Node
|
|
434
|
+
# AST node type
|
|
435
|
+
@ast_type = :observed_term
|
|
436
|
+
# Observed terms have semantics
|
|
437
|
+
@has_semantics = true
|
|
438
|
+
|
|
439
|
+
# New ObservedTerm AST node.
|
|
440
|
+
#
|
|
441
|
+
# @see Node#initialize Node class for basic properties
|
|
442
|
+
def initialize(children = [], properties = {})
|
|
443
|
+
super(ObservedTerm.ast_type, children, properties)
|
|
444
|
+
end
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
# AST node representing a simple statement.
|
|
448
|
+
class SimpleStatement < Node
|
|
449
|
+
# AST node type
|
|
450
|
+
@ast_type = :simple_statement
|
|
451
|
+
# Simple statements have semantics
|
|
452
|
+
@has_semantics = true
|
|
453
|
+
|
|
454
|
+
# New SimpleStatement AST node.
|
|
455
|
+
#
|
|
456
|
+
# @see Node#initialize Node class for basic properties
|
|
457
|
+
def initialize(children = [], properties = {})
|
|
458
|
+
super(SimpleStatement.ast_type, children, properties)
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
# Get the relationship of the nested statement.
|
|
462
|
+
def relatitonship
|
|
463
|
+
# TODO: access children for content
|
|
464
|
+
end
|
|
465
|
+
|
|
466
|
+
# Get the object of the nested statement.
|
|
467
|
+
def object
|
|
468
|
+
# TODO: access children for content
|
|
469
|
+
end
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
# AST node representing the subject of a statement.
|
|
473
|
+
class Subject < Node
|
|
474
|
+
# AST node type
|
|
475
|
+
@ast_type = :subject
|
|
476
|
+
# Subject have semantics
|
|
477
|
+
@has_semantics = true
|
|
478
|
+
|
|
479
|
+
# New Subject AST node.
|
|
480
|
+
#
|
|
481
|
+
# @see Node#initialize Node class for basic properties
|
|
482
|
+
def initialize(children = [], properties = {})
|
|
483
|
+
super(Subject.ast_type, children, properties)
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
# Get the subject's term.
|
|
487
|
+
def term
|
|
488
|
+
children[0]
|
|
489
|
+
end
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
# AST node representing the object of a statement.
|
|
493
|
+
class Object < Node
|
|
494
|
+
# AST node type
|
|
495
|
+
@ast_type = :object
|
|
496
|
+
# Object have semantics
|
|
497
|
+
@has_semantics = true
|
|
498
|
+
|
|
499
|
+
# New Object AST node.
|
|
500
|
+
#
|
|
501
|
+
# @see Node#initialize Node class for basic properties
|
|
502
|
+
def initialize(children = [], properties = {})
|
|
503
|
+
super(Object.ast_type, children, properties)
|
|
504
|
+
end
|
|
505
|
+
|
|
506
|
+
# Does the object have a {Term} child?
|
|
507
|
+
def has_term?
|
|
508
|
+
children[0].is_a?(Term)
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
# Does the object have a {Statement} child?
|
|
512
|
+
def has_statement?
|
|
513
|
+
children[0].is_a?(Statement)
|
|
514
|
+
end
|
|
515
|
+
|
|
516
|
+
# Get the {Term} or {Statement} child.
|
|
517
|
+
def child
|
|
518
|
+
children[0]
|
|
519
|
+
end
|
|
520
|
+
end
|
|
521
|
+
|
|
522
|
+
# AST node representing a UTF-8 encoded string
|
|
523
|
+
class String < Node
|
|
524
|
+
# AST node type
|
|
525
|
+
@ast_type = :string
|
|
526
|
+
# String have no semantic meaning
|
|
527
|
+
@has_semantics = false
|
|
528
|
+
|
|
529
|
+
# New String AST node.
|
|
530
|
+
#
|
|
531
|
+
# @see Node#initialize Node class for basic properties
|
|
532
|
+
def initialize(children = [], properties = {})
|
|
533
|
+
super(String.ast_type, children, properties)
|
|
534
|
+
end
|
|
535
|
+
|
|
536
|
+
# Get the string literal.
|
|
537
|
+
def string_literal
|
|
538
|
+
children[0]
|
|
539
|
+
end
|
|
540
|
+
end
|
|
541
|
+
|
|
542
|
+
# AST node representing a term.
|
|
543
|
+
class Term < Node
|
|
544
|
+
# AST node type
|
|
545
|
+
@ast_type = :term
|
|
546
|
+
# Terms have semantics
|
|
547
|
+
@has_semantics = true
|
|
548
|
+
|
|
549
|
+
# New Term AST node.
|
|
550
|
+
#
|
|
551
|
+
# @see Node#initialize Node class for basic properties
|
|
552
|
+
def initialize(children = [], properties = {})
|
|
553
|
+
super(Term.ast_type, children, properties)
|
|
554
|
+
end
|
|
555
|
+
|
|
556
|
+
# Get the term's function.
|
|
557
|
+
def function
|
|
558
|
+
children[0]
|
|
559
|
+
end
|
|
560
|
+
|
|
561
|
+
# Get the term's arguments.
|
|
562
|
+
def arguments
|
|
563
|
+
children[1..-1]
|
|
564
|
+
end
|
|
565
|
+
|
|
566
|
+
# Get the term's function semantics.
|
|
567
|
+
def function_semantics
|
|
568
|
+
@function_semantics
|
|
569
|
+
end
|
|
570
|
+
|
|
571
|
+
# Sets the term's function semantics.
|
|
572
|
+
def function_semantics=(function_semantics)
|
|
573
|
+
if function_semantics != nil && !function_semantics.is_a?(BELParser::Language::Signature)
|
|
574
|
+
raise ArgumentError, "function_semantics: expected nil or BELParser::Language::Signature"
|
|
575
|
+
end
|
|
576
|
+
assign_properties({function_semantics: function_semantics})
|
|
577
|
+
end
|
|
578
|
+
end
|
|
579
|
+
|
|
580
|
+
# AST node representing an unset.
|
|
581
|
+
class Unset < Node
|
|
582
|
+
# AST node type
|
|
583
|
+
@ast_type = :unset
|
|
584
|
+
# Unset has semantics; what was unset?
|
|
585
|
+
@has_semantics = true
|
|
586
|
+
|
|
587
|
+
# New Unset AST node.
|
|
588
|
+
#
|
|
589
|
+
# @see Node#initialize Node class for basic properties
|
|
590
|
+
def initialize(children = [], properties = {})
|
|
591
|
+
super(Unset.ast_type, children, properties)
|
|
592
|
+
end
|
|
593
|
+
|
|
594
|
+
# Get what is being unset.
|
|
595
|
+
def name
|
|
596
|
+
# TODO: access children for content
|
|
597
|
+
end
|
|
598
|
+
end
|
|
599
|
+
|
|
600
|
+
# AST node representing a value.
|
|
601
|
+
#
|
|
602
|
+
# === Special node properties
|
|
603
|
+
# - _encoding_: {#encoding}
|
|
604
|
+
#
|
|
605
|
+
class Value < Node
|
|
606
|
+
# AST node type
|
|
607
|
+
@ast_type = :value
|
|
608
|
+
# Values have semantics (encodings)
|
|
609
|
+
@has_semantics = true
|
|
610
|
+
|
|
611
|
+
# New Value AST node.
|
|
612
|
+
#
|
|
613
|
+
# @see Node#initialize Node class for basic properties
|
|
614
|
+
def initialize(children = [], properties = {})
|
|
615
|
+
super(Value.ast_type, children, properties)
|
|
616
|
+
end
|
|
617
|
+
|
|
618
|
+
# Get the value's encoding.
|
|
619
|
+
attr_reader :encoding
|
|
620
|
+
end
|
|
621
|
+
|
|
622
|
+
module Sexp
|
|
623
|
+
def nested_statement(*children)
|
|
624
|
+
NestedStatement.new(children)
|
|
625
|
+
end
|
|
626
|
+
|
|
627
|
+
def simple_statement(*children)
|
|
628
|
+
SimpleStatement.new(children)
|
|
629
|
+
end
|
|
630
|
+
|
|
631
|
+
def observed_term(*children)
|
|
632
|
+
ObservedTerm.new(children)
|
|
633
|
+
end
|
|
634
|
+
|
|
635
|
+
def statement(*children)
|
|
636
|
+
Statement.new(children)
|
|
637
|
+
end
|
|
638
|
+
|
|
639
|
+
def subject(*children)
|
|
640
|
+
Subject.new(children)
|
|
641
|
+
end
|
|
642
|
+
|
|
643
|
+
def object(*children)
|
|
644
|
+
Object.new(children)
|
|
645
|
+
end
|
|
646
|
+
|
|
647
|
+
def relationship(*children)
|
|
648
|
+
Relationship.new(children)
|
|
649
|
+
end
|
|
650
|
+
|
|
651
|
+
def term(*children)
|
|
652
|
+
Term.new(children)
|
|
653
|
+
end
|
|
654
|
+
|
|
655
|
+
def function(*children)
|
|
656
|
+
Function.new(children)
|
|
657
|
+
end
|
|
658
|
+
|
|
659
|
+
def argument(*children)
|
|
660
|
+
Argument.new(children)
|
|
661
|
+
end
|
|
662
|
+
|
|
663
|
+
def parameter(*children)
|
|
664
|
+
Parameter.new(children)
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
def prefix(*children)
|
|
668
|
+
Prefix.new(children)
|
|
669
|
+
end
|
|
670
|
+
|
|
671
|
+
def value(*children)
|
|
672
|
+
Value.new(children)
|
|
673
|
+
end
|
|
674
|
+
|
|
675
|
+
def identifier(*children)
|
|
676
|
+
Identifier.new(children)
|
|
677
|
+
end
|
|
678
|
+
|
|
679
|
+
def string(*children)
|
|
680
|
+
String.new(children)
|
|
681
|
+
end
|
|
682
|
+
|
|
683
|
+
def list(*children)
|
|
684
|
+
List.new(children)
|
|
685
|
+
end
|
|
686
|
+
|
|
687
|
+
def comment(*children)
|
|
688
|
+
Comment.new(children)
|
|
689
|
+
end
|
|
690
|
+
|
|
691
|
+
def comment_line(*children)
|
|
692
|
+
CommentLine.new(children)
|
|
693
|
+
end
|
|
694
|
+
|
|
695
|
+
def annotation_definition(*children)
|
|
696
|
+
AnnotationDefinition.new(children)
|
|
697
|
+
end
|
|
698
|
+
|
|
699
|
+
def namespace_definition(*children)
|
|
700
|
+
NamespaceDefinition.new(children)
|
|
701
|
+
end
|
|
702
|
+
end
|
|
703
|
+
end
|
|
704
|
+
end
|
|
705
|
+
end
|