Browse Source

Scan parens

master
Dylan Baker 5 years ago
parent
commit
f421c3c196
7 changed files with 98 additions and 8 deletions
  1. 3
    5
      lib/chervil.rb
  2. 35
    0
      lib/chervil/lexer.rb
  3. 15
    0
      lib/chervil/token.rb
  4. 23
    0
      package-lock.json
  5. 9
    0
      package.json
  6. 9
    0
      spec/lexer_spec.rb
  7. 4
    3
      spec/spec_helper.rb

+ 3
- 5
lib/chervil.rb View File

@@ -1,5 +1,3 @@
1
-require "chervil/version"
2
-
3
-module Chervil
4
-  # Your code goes here...
5
-end
1
+require 'chervil/lexer'
2
+require 'chervil/token'
3
+require 'chervil/version'

+ 35
- 0
lib/chervil/lexer.rb View File

@@ -0,0 +1,35 @@
1
+module Chervil
2
+  class Lexer
3
+    def initialize(source)
4
+      @source = source
5
+      @position = 0
6
+    end
7
+
8
+    def current_char
9
+      @source[@position]
10
+    end
11
+
12
+    def advance
13
+      @position += 1
14
+    end
15
+
16
+    def get_next_token
17
+      case current_char
18
+      when '('
19
+        advance
20
+        Token.new(:lparen, "(")
21
+      when ')'
22
+        advance
23
+        Token.new(:rparen, ")")
24
+      end
25
+    end
26
+
27
+    def tokenize
28
+      tokens = Array.new
29
+      until @position == @source.size
30
+        tokens << get_next_token
31
+      end
32
+      tokens
33
+    end
34
+  end
35
+end

+ 15
- 0
lib/chervil/token.rb View File

@@ -0,0 +1,15 @@
1
+module Chervil
2
+  class Token
3
+    attr_reader :type
4
+    attr_reader :value
5
+
6
+    def initialize(type, value)
7
+      @type = type
8
+      @value = value
9
+    end
10
+
11
+    def ==(other)
12
+      @type == other.type && @value == other.value
13
+    end
14
+  end
15
+end

+ 23
- 0
package-lock.json View File

@@ -0,0 +1,23 @@
1
+{
2
+  "name": "chervil",
3
+  "version": "1.0.0",
4
+  "lockfileVersion": 1,
5
+  "requires": true,
6
+  "dependencies": {
7
+    "@prettier/plugin-ruby": {
8
+      "version": "0.6.2",
9
+      "resolved": "https://registry.npmjs.org/@prettier/plugin-ruby/-/plugin-ruby-0.6.2.tgz",
10
+      "integrity": "sha512-wTZ+Vrrxg6JwdrA23t+vUz+oaXcPeBCGmpCGKFeKQc7ls1+NOoZ7SLjYcf5ttxnNxFlIX2D4H74yhCEwX/HetQ==",
11
+      "dev": true,
12
+      "requires": {
13
+        "prettier": "^1.16.4"
14
+      }
15
+    },
16
+    "prettier": {
17
+      "version": "1.16.4",
18
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz",
19
+      "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==",
20
+      "dev": true
21
+    }
22
+  }
23
+}

+ 9
- 0
package.json View File

@@ -0,0 +1,9 @@
1
+{
2
+  "scripts": {
3
+    "format": "prettier --write **/*.rb"
4
+  },
5
+  "devDependencies": {
6
+    "@prettier/plugin-ruby": "^0.6.2",
7
+    "prettier": "^1.16.4"
8
+  }
9
+}

+ 9
- 0
spec/lexer_spec.rb View File

@@ -0,0 +1,9 @@
1
+module Chervil
2
+  RSpec.describe Lexer do
3
+    it 'lexes parens' do
4
+      expect(Lexer.new('()').tokenize).to eq(
5
+        [Token.new(:lparen, '('), Token.new(:rparen, ')')]
6
+      )
7
+    end
8
+  end
9
+end

+ 4
- 3
spec/spec_helper.rb View File

@@ -1,9 +1,10 @@
1
-require "bundler/setup"
2
-require "chervil"
1
+require 'bundler/setup'
2
+require 'chervil'
3 3
 
4 4
 RSpec.configure do |config|
5 5
   # Enable flags like --only-failures and --next-failure
6
-  config.example_status_persistence_file_path = ".rspec_status"
6
+  config.example_status_persistence_file_path =
7
+    '.rspec_status'
7 8
 
8 9
   # Disable RSpec exposing methods globally on `Module` and `main`
9 10
   config.disable_monkey_patching!

Loading…
Cancel
Save