quecto_calc 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +1 -1
- data/lib/quecto_calc/evaluator.rb +28 -14
- data/lib/quecto_calc/quecto_calc_error.rb +24 -0
- data/lib/quecto_calc/version.rb +1 -1
- data/lib/quecto_calc.rb +9 -26
- data/quecto_calc.gemspec +1 -1
- metadata +18 -11
- data/lib/quecto_calc/bin_op_node.rb +0 -14
- data/lib/quecto_calc/char_rules.rb +0 -15
- data/lib/quecto_calc/lexer.rb +0 -111
- data/lib/quecto_calc/number_node.rb +0 -12
- data/lib/quecto_calc/parser.rb +0 -87
- data/lib/quecto_calc/quecto_error.rb +0 -46
- data/lib/quecto_calc/token.rb +0 -13
- data/lib/quecto_calc/token_types.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 44bae8aee9c0431cfd4ea0b75aefe914bdc55f3e0ea4565c889ad608c7f67b64
|
4
|
+
data.tar.gz: 8a2a5b6e5e59304c184e2aa0eea67b36fdb9a90ccfa23fd19f71065a241fb135
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5decd805cf29de3744f18b161ea4cd0557df6ee6886f6a7f68527ce791083640ce8a29f92e4f5a3e0985bf19c21cf2dd4a4297c58f06ce9da1d8bfecbe6d1cb1
|
7
|
+
data.tar.gz: 78025741efc21e5957ccbab21ca3fab3963ddb47eb50b6e08f9c116d289b8d20d995f7357e9113141af9829fed8bd9419d871b787c688eae3d2567dbe5e5e178
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,14 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "
|
4
|
-
require_relative "token_types"
|
3
|
+
require_relative "quecto_calc_error"
|
5
4
|
|
6
5
|
#
|
7
6
|
# Evaluates expression from the abstract syntax tree.
|
8
7
|
#
|
9
8
|
class Evaluator
|
10
|
-
include TokenTypes
|
11
|
-
|
12
9
|
#
|
13
10
|
# Initialize an evaluator instance.
|
14
11
|
#
|
@@ -20,10 +17,27 @@ class Evaluator
|
|
20
17
|
end
|
21
18
|
|
22
19
|
#
|
23
|
-
# @param [BinOpNode, NumberNode] node
|
20
|
+
# @param [QuectoParser::BinOpNode, QuectoParser::NumberNode] node
|
24
21
|
#
|
25
22
|
def visit(node)
|
26
|
-
|
23
|
+
method_name = "_visit_#{node.class}"
|
24
|
+
send(method_name, node)
|
25
|
+
end
|
26
|
+
|
27
|
+
#
|
28
|
+
# @param [String] _method_name
|
29
|
+
#
|
30
|
+
# @param [Object] node
|
31
|
+
#
|
32
|
+
# @raise [NoMethodError]
|
33
|
+
#
|
34
|
+
def method_missing(_method_name, node)
|
35
|
+
error_msg = "unsupported node type: #{node.class}. Plase check parser's output for correct node types."
|
36
|
+
raise NoMethodError, error_msg
|
37
|
+
end
|
38
|
+
|
39
|
+
def respond_to_missing?(*)
|
40
|
+
true
|
27
41
|
end
|
28
42
|
|
29
43
|
private
|
@@ -31,7 +45,7 @@ class Evaluator
|
|
31
45
|
#
|
32
46
|
# Retrieve result of a binary operation node.
|
33
47
|
#
|
34
|
-
# @param [BinOpNode] node
|
48
|
+
# @param [QuectoParser::BinOpNode] node
|
35
49
|
#
|
36
50
|
# @return [Numeric]
|
37
51
|
# Result of the binary operation.
|
@@ -41,9 +55,9 @@ class Evaluator
|
|
41
55
|
right = visit(node.right_node)
|
42
56
|
|
43
57
|
case node.operator.type
|
44
|
-
when TT_PLUS
|
58
|
+
when TokenTypes::TT_PLUS
|
45
59
|
left + right
|
46
|
-
when TT_MINUS
|
60
|
+
when TokenTypes::TT_MINUS
|
47
61
|
left - right
|
48
62
|
end
|
49
63
|
end
|
@@ -51,15 +65,15 @@ class Evaluator
|
|
51
65
|
#
|
52
66
|
# Retrieve value of a number node.
|
53
67
|
#
|
54
|
-
# @param [NumberNode] node
|
68
|
+
# @param [QuectoParser::NumberNode] node
|
55
69
|
#
|
56
70
|
# @return [Numeric]
|
57
71
|
#
|
58
72
|
def _visit_NumberNode(node)
|
59
73
|
case node.token.type
|
60
|
-
when TT_INT
|
74
|
+
when TokenTypes::TT_INT
|
61
75
|
node.token.value
|
62
|
-
when TT_CONST
|
76
|
+
when TokenTypes::TT_CONST
|
63
77
|
_init_constant(node)
|
64
78
|
end
|
65
79
|
end
|
@@ -67,12 +81,12 @@ class Evaluator
|
|
67
81
|
#
|
68
82
|
# Replace constant with an associated value.
|
69
83
|
#
|
70
|
-
# @param [NumberNode] node
|
84
|
+
# @param [QuectoParser::NumberNode] node
|
71
85
|
# A numeric node with @token of TT_CONST type.
|
72
86
|
#
|
73
87
|
# @return [Numeric]
|
74
88
|
#
|
75
|
-
# @raise [CalcError]
|
89
|
+
# @raise [CalcError::RunTimeError]
|
76
90
|
# Raises if constant is not found in the @consts.
|
77
91
|
#
|
78
92
|
def _init_constant(node)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Errors rised by the quecto_calc.
|
5
|
+
#
|
6
|
+
class QuectoCalcError < ::StandardError
|
7
|
+
attr_reader :message
|
8
|
+
|
9
|
+
def initialize(message)
|
10
|
+
@message = message
|
11
|
+
super()
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
#
|
16
|
+
# Raised by the evaluator on an illegal operation.
|
17
|
+
#
|
18
|
+
class CalcError < QuectoCalcError
|
19
|
+
attr_reader :message
|
20
|
+
|
21
|
+
def initialize(message = "")
|
22
|
+
super(message)
|
23
|
+
end
|
24
|
+
end
|
data/lib/quecto_calc/version.rb
CHANGED
data/lib/quecto_calc.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "quecto_parser"
|
4
|
+
|
3
5
|
require_relative "quecto_calc/evaluator"
|
4
|
-
require_relative "quecto_calc/lexer"
|
5
|
-
require_relative "quecto_calc/parser"
|
6
6
|
require_relative "quecto_calc/version"
|
7
7
|
|
8
8
|
#
|
@@ -24,41 +24,22 @@ class QuectoCalc
|
|
24
24
|
# Evaluate an expression.
|
25
25
|
#
|
26
26
|
# @param [String] expr
|
27
|
-
# Expression to parse and evaluate.
|
27
|
+
# Expression (in a text form) to parse and evaluate.
|
28
28
|
#
|
29
29
|
# @option [Hash{ String => Numeric }] consts
|
30
30
|
# List on constants and their values to put in the expression.
|
31
31
|
#
|
32
32
|
def evaluate(expr, consts = {})
|
33
|
-
|
34
|
-
ast = build_ast(tokens)
|
35
|
-
evaluate_ast(ast, consts)
|
36
|
-
rescue QuectoError => e
|
37
|
-
puts "#{e.error_name} #{e.message}"
|
38
|
-
end
|
33
|
+
parser = QuectoParser.new
|
39
34
|
|
40
|
-
|
41
|
-
|
42
|
-
#
|
43
|
-
# @param [String] expr
|
44
|
-
#
|
45
|
-
def build_tokens(expr)
|
46
|
-
Lexer.new(expr).build_tokens
|
47
|
-
end
|
48
|
-
|
49
|
-
#
|
50
|
-
# Build an abstract syntax tree from a list of tokens.
|
51
|
-
#
|
52
|
-
# @param [Array<Token>] tokens
|
53
|
-
#
|
54
|
-
def build_ast(tokens)
|
55
|
-
Parser.new(tokens).parse
|
35
|
+
ast = parser.parse_expr(expr)
|
36
|
+
evaluate_ast(ast, consts) if ast
|
56
37
|
end
|
57
38
|
|
58
39
|
#
|
59
40
|
# Evaluate expression from the AST.
|
60
41
|
#
|
61
|
-
# @param [NumberNode, BinOpNode] ast
|
42
|
+
# @param [QuectoParser::NumberNode, QuectoParser::BinOpNode] ast
|
62
43
|
# Expression (in a form of AST) to evaluate.
|
63
44
|
#
|
64
45
|
# @option [Hash{ String => Numeric }] consts
|
@@ -67,5 +48,7 @@ class QuectoCalc
|
|
67
48
|
def evaluate_ast(ast, consts = {})
|
68
49
|
evaluator = Evaluator.new(consts)
|
69
50
|
evaluator.visit(ast)
|
51
|
+
rescue QuectoCalcError, NoMethodError => e
|
52
|
+
puts "[#{e.class}] #{e.message}"
|
70
53
|
end
|
71
54
|
end
|
data/quecto_calc.gemspec
CHANGED
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.require_paths = ["lib"]
|
31
31
|
|
32
32
|
# Uncomment to register a new dependency of your gem
|
33
|
-
|
33
|
+
spec.add_dependency "quecto_parser", "~> 0.1.0"
|
34
34
|
|
35
35
|
# For more information and examples about making a new gem, checkout our
|
36
36
|
# guide at: https://bundler.io/guides/creating_gem.html
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quecto_calc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mate
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-02-
|
12
|
-
dependencies:
|
11
|
+
date: 2023-02-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: quecto_parser
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.1.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.1.0
|
13
27
|
description: Evaluates primitive arithmetic expressions represented in a text form.
|
14
28
|
email:
|
15
29
|
executables: []
|
@@ -27,15 +41,8 @@ files:
|
|
27
41
|
- bin/console
|
28
42
|
- bin/setup
|
29
43
|
- lib/quecto_calc.rb
|
30
|
-
- lib/quecto_calc/bin_op_node.rb
|
31
|
-
- lib/quecto_calc/char_rules.rb
|
32
44
|
- lib/quecto_calc/evaluator.rb
|
33
|
-
- lib/quecto_calc/
|
34
|
-
- lib/quecto_calc/number_node.rb
|
35
|
-
- lib/quecto_calc/parser.rb
|
36
|
-
- lib/quecto_calc/quecto_error.rb
|
37
|
-
- lib/quecto_calc/token.rb
|
38
|
-
- lib/quecto_calc/token_types.rb
|
45
|
+
- lib/quecto_calc/quecto_calc_error.rb
|
39
46
|
- lib/quecto_calc/version.rb
|
40
47
|
- quecto_calc.gemspec
|
41
48
|
homepage: https://github.com/8bit-mate/quecto_calc.rb/
|
@@ -1,14 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
#
|
4
|
-
# Stores a node with a binary operation (between two numbers).
|
5
|
-
#
|
6
|
-
class BinOpNode
|
7
|
-
attr_reader :left_node, :operator, :right_node
|
8
|
-
|
9
|
-
def initialize(left_node, operator, right_node)
|
10
|
-
@left_node = left_node
|
11
|
-
@operator = operator
|
12
|
-
@right_node = right_node
|
13
|
-
end
|
14
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
#
|
4
|
-
# Provides character rules that are used by the lexer.
|
5
|
-
#
|
6
|
-
module CharRules
|
7
|
-
NUM_CHAR = /[[:digit:]]/.freeze # characters that could form a number: digits only
|
8
|
-
CONST_FIRST_CHAR = /[[:alpha:]]/.freeze # characters that could be used as a 1st char. in the constant name
|
9
|
-
CONTS_CHAR = /[[:alpha:][:digit:]_]/.freeze # characters that could form a constant: letters, digits, underscore char.
|
10
|
-
|
11
|
-
ADD_CHAR = "+" # character that marks an addition operator
|
12
|
-
SUB_CHAR = "-" # character that marks an subtraction operator
|
13
|
-
|
14
|
-
IGNOR_CHAR = /\s/.freeze # characters that are ignored: all whitespace
|
15
|
-
end
|
data/lib/quecto_calc/lexer.rb
DELETED
@@ -1,111 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "char_rules"
|
4
|
-
require_relative "quecto_error"
|
5
|
-
require_relative "token"
|
6
|
-
require_relative "token_types"
|
7
|
-
|
8
|
-
#
|
9
|
-
# Performs lexical analysis of a given string.
|
10
|
-
#
|
11
|
-
class Lexer
|
12
|
-
include TokenTypes
|
13
|
-
include CharRules
|
14
|
-
|
15
|
-
#
|
16
|
-
# Initialize a lexer instance.
|
17
|
-
#
|
18
|
-
# @param [String] str
|
19
|
-
# String to parse.
|
20
|
-
#
|
21
|
-
def initialize(str)
|
22
|
-
@str = str
|
23
|
-
@pos = 0
|
24
|
-
@cur_char = nil
|
25
|
-
|
26
|
-
_next_char
|
27
|
-
end
|
28
|
-
|
29
|
-
#
|
30
|
-
# Create a list of tokens from a string.
|
31
|
-
#
|
32
|
-
# @return [Array<Token>] tokens
|
33
|
-
#
|
34
|
-
# @raise [IllegalCharError]
|
35
|
-
# Raises when @str has an unsupported character.
|
36
|
-
#
|
37
|
-
def build_tokens
|
38
|
-
tokens = []
|
39
|
-
|
40
|
-
until @cur_char.nil?
|
41
|
-
if @cur_char == ADD_CHAR
|
42
|
-
tokens.append(Token.new(type: TT_PLUS))
|
43
|
-
elsif @cur_char == SUB_CHAR
|
44
|
-
tokens.append(Token.new(type: TT_MINUS))
|
45
|
-
elsif @cur_char.match?(NUM_CHAR)
|
46
|
-
num = Token.new(type: TT_INT, value: _build_word(NUM_CHAR).to_i)
|
47
|
-
tokens.append(num)
|
48
|
-
elsif @cur_char.match?(CONST_FIRST_CHAR)
|
49
|
-
num = Token.new(type: TT_CONST, value: _build_word(CONTS_CHAR))
|
50
|
-
tokens.append(num)
|
51
|
-
elsif @cur_char.match?(IGNOR_CHAR)
|
52
|
-
# Ignore whitespace.
|
53
|
-
else
|
54
|
-
error_msg = "illegal character '#{@cur_char}' at the position: #{@pos - 1}"
|
55
|
-
raise IllegalCharError, error_msg
|
56
|
-
end
|
57
|
-
_next_char
|
58
|
-
end
|
59
|
-
|
60
|
-
tokens.append(Token.new(type: TT_EOF))
|
61
|
-
|
62
|
-
tokens
|
63
|
-
end
|
64
|
-
|
65
|
-
private
|
66
|
-
|
67
|
-
#
|
68
|
-
# Build a 'word' out of a sequence of characters.
|
69
|
-
#
|
70
|
-
# A 'word' is a sequence of characters followed one by another without break characters (e.g. a space or a supported
|
71
|
-
# math operator: '+', '-', etc).
|
72
|
-
#
|
73
|
-
# A 'word' could be represented in a form of:
|
74
|
-
#
|
75
|
-
# 1. a sequence of alphabetical characters optionally mixed with digits and joined into one string using a connective
|
76
|
-
# character '_'. Examples:
|
77
|
-
# - 'ruby' (a sequence of alphabetical characters only);
|
78
|
-
# - 'foobar9000' (a mix of alphabetical characters and digits);
|
79
|
-
# - 'this_is_a_3rd_example' (long string joined with a connective character).
|
80
|
-
#
|
81
|
-
# 2. an integer number, e.g.: '31337' (a sequence of digits without break characters).
|
82
|
-
#
|
83
|
-
# @param [Regexp] regexp
|
84
|
-
# Defines that kind of character sequence the method should be looking for: NUM_CHAR (search for a digit) or
|
85
|
-
# CONTS_CHAR (search for a constant).
|
86
|
-
#
|
87
|
-
# @return [String] word
|
88
|
-
#
|
89
|
-
def _build_word(regexp)
|
90
|
-
word = ""
|
91
|
-
|
92
|
-
until @cur_char.nil?
|
93
|
-
break unless @cur_char.match?(regexp)
|
94
|
-
|
95
|
-
word += @cur_char
|
96
|
-
_next_char
|
97
|
-
end
|
98
|
-
_next_char
|
99
|
-
|
100
|
-
@pos -= 1
|
101
|
-
word
|
102
|
-
end
|
103
|
-
|
104
|
-
#
|
105
|
-
# Process next character in the string.
|
106
|
-
#
|
107
|
-
def _next_char
|
108
|
-
@cur_char = @pos < @str.length ? @str[@pos] : nil
|
109
|
-
@pos += 1
|
110
|
-
end
|
111
|
-
end
|
data/lib/quecto_calc/parser.rb
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "bin_op_node"
|
4
|
-
require_relative "number_node"
|
5
|
-
require_relative "quecto_error"
|
6
|
-
require_relative "token_types"
|
7
|
-
|
8
|
-
#
|
9
|
-
# Parses list of tokens to build an abstract syntax tree.
|
10
|
-
#
|
11
|
-
class Parser
|
12
|
-
include TokenTypes
|
13
|
-
|
14
|
-
#
|
15
|
-
# Initialize a parser instance.
|
16
|
-
#
|
17
|
-
# @param [Array<Token>] tokens
|
18
|
-
# List of tokens to parse.
|
19
|
-
#
|
20
|
-
def initialize(tokens)
|
21
|
-
@tokens = tokens
|
22
|
-
@cur_token = @tokens[0]
|
23
|
-
@idx = 0
|
24
|
-
end
|
25
|
-
|
26
|
-
#
|
27
|
-
# Parse list of tokens.
|
28
|
-
#
|
29
|
-
def parse
|
30
|
-
_expr
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
#
|
36
|
-
# Buid a node for the expression.
|
37
|
-
#
|
38
|
-
# @return [BinOpNode, NumberNode] left
|
39
|
-
# Node for an expression. The left.class corresponds to the expression type: a single number or a binary operation
|
40
|
-
# (an operation between two numbers).
|
41
|
-
#
|
42
|
-
def _expr
|
43
|
-
# retrieve left part of the expression:
|
44
|
-
left = _term
|
45
|
-
|
46
|
-
while BIN_OPS.include?(@cur_token.type)
|
47
|
-
# retrieve operator between two number nodes:
|
48
|
-
op_tok = @cur_token
|
49
|
-
|
50
|
-
# retrieve right part of the expression:
|
51
|
-
_next_token
|
52
|
-
right = _term
|
53
|
-
|
54
|
-
left = BinOpNode.new(left, op_tok, right)
|
55
|
-
end
|
56
|
-
|
57
|
-
left
|
58
|
-
end
|
59
|
-
|
60
|
-
#
|
61
|
-
# Search for a term in the expression.
|
62
|
-
#
|
63
|
-
# @return [NumberNode] token
|
64
|
-
# Found term.
|
65
|
-
#
|
66
|
-
# @raise [InvalidSyntaxError]
|
67
|
-
#
|
68
|
-
def _term
|
69
|
-
if TERMS.include?(@cur_token.type)
|
70
|
-
token = NumberNode.new(@cur_token)
|
71
|
-
else
|
72
|
-
error_msg = "expected TT_INT or TT_LBL, but got #{@cur_token.type}"
|
73
|
-
raise InvalidSyntaxError, error_msg
|
74
|
-
end
|
75
|
-
|
76
|
-
_next_token
|
77
|
-
token
|
78
|
-
end
|
79
|
-
|
80
|
-
#
|
81
|
-
# Process next token.
|
82
|
-
#
|
83
|
-
def _next_token
|
84
|
-
@idx += 1
|
85
|
-
@cur_token = @tokens[@idx] if @idx < @tokens.length
|
86
|
-
end
|
87
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
#
|
4
|
-
# Errors rised by the quecto_calc.
|
5
|
-
#
|
6
|
-
class QuectoError < ::StandardError
|
7
|
-
attr_reader :error_name, :message
|
8
|
-
|
9
|
-
def initialize(error_name, message)
|
10
|
-
@error_name = error_name
|
11
|
-
@message = message
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
#
|
16
|
-
# Raised by the lexer if an illegal character is found.
|
17
|
-
#
|
18
|
-
class IllegalCharError < QuectoError
|
19
|
-
attr_reader :message
|
20
|
-
|
21
|
-
def initialize(message = "")
|
22
|
-
super("Illegal Character:", message)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
#
|
27
|
-
# Raised by the parser if an illegal syntax is found.
|
28
|
-
#
|
29
|
-
class InvalidSyntaxError < QuectoError
|
30
|
-
attr_reader :message
|
31
|
-
|
32
|
-
def initialize(message = "")
|
33
|
-
super("Syntax Error:", message)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
#
|
38
|
-
# Raised by the evaluator on an illegal operation.
|
39
|
-
#
|
40
|
-
class CalcError < QuectoError
|
41
|
-
attr_reader :message
|
42
|
-
|
43
|
-
def initialize(message = "")
|
44
|
-
super("Runtime Error:", message)
|
45
|
-
end
|
46
|
-
end
|
data/lib/quecto_calc/token.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
#
|
4
|
-
# Provides supported token types.
|
5
|
-
#
|
6
|
-
module TokenTypes
|
7
|
-
TT_INT = :TT_INT # integer number
|
8
|
-
TT_CONST = :TT_CONST # constant (placeholder for a numeric value)
|
9
|
-
TT_PLUS = :TT_PLUS # addition operator
|
10
|
-
TT_MINUS = :TT_MINUS # subtraction operator
|
11
|
-
TT_EOF = :TT_EOF # end of input
|
12
|
-
|
13
|
-
TERMS = [TT_INT, TT_CONST].freeze
|
14
|
-
|
15
|
-
BIN_OPS = [TT_PLUS, TT_MINUS].freeze
|
16
|
-
end
|