layo 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/LICENSE +26 -0
  2. data/README.mkd +103 -0
  3. data/Rakefile +21 -0
  4. data/UnicodeData.txt +23697 -0
  5. data/bin/layo +22 -0
  6. data/layo.gemspec +23 -0
  7. data/lib/layo.rb +11 -0
  8. data/lib/layo/ast.rb +5 -0
  9. data/lib/layo/ast/block.rb +13 -0
  10. data/lib/layo/ast/expression.rb +14 -0
  11. data/lib/layo/ast/node.rb +6 -0
  12. data/lib/layo/ast/program.rb +9 -0
  13. data/lib/layo/ast/statement.rb +10 -0
  14. data/lib/layo/interpreter.rb +360 -0
  15. data/lib/layo/lexer.rb +162 -0
  16. data/lib/layo/parser.rb +371 -0
  17. data/lib/layo/peekable.rb +31 -0
  18. data/lib/layo/runtime_error.rb +9 -0
  19. data/lib/layo/syntax_error.rb +14 -0
  20. data/lib/layo/tokenizer.rb +119 -0
  21. data/lib/layo/unexpected_token_error.rb +13 -0
  22. data/lib/layo/unicode.rb +23614 -0
  23. data/lib/layo/unknown_token_error.rb +7 -0
  24. data/spec/interpreter_spec.rb +52 -0
  25. data/spec/lexer_spec.rb +176 -0
  26. data/spec/parser_spec.rb +373 -0
  27. data/spec/source/basic/comments.lol +16 -0
  28. data/spec/source/basic/comments.out +2 -0
  29. data/spec/source/basic/line-continuation.lol +8 -0
  30. data/spec/source/basic/line-continuation.out +2 -0
  31. data/spec/source/basic/line-endings.lol +5 -0
  32. data/spec/source/basic/line-endings.out +3 -0
  33. data/spec/source/basic/minimal.lol +2 -0
  34. data/spec/source/casting/boolean.lol +8 -0
  35. data/spec/source/casting/boolean.out +5 -0
  36. data/spec/source/casting/float.lol +10 -0
  37. data/spec/source/casting/float.out +5 -0
  38. data/spec/source/casting/int.lol +9 -0
  39. data/spec/source/casting/int.out +4 -0
  40. data/spec/source/casting/nil.lol +9 -0
  41. data/spec/source/casting/nil.out +4 -0
  42. data/spec/source/casting/string.lol +5 -0
  43. data/spec/source/casting/string.out +2 -0
  44. data/spec/source/expressions/boolean.lol +30 -0
  45. data/spec/source/expressions/boolean.out +17 -0
  46. data/spec/source/expressions/cast.lol +28 -0
  47. data/spec/source/expressions/cast.out +20 -0
  48. data/spec/source/expressions/function.lol +24 -0
  49. data/spec/source/expressions/function.out +4 -0
  50. data/spec/source/expressions/math.lol +9 -0
  51. data/spec/source/expressions/math.out +7 -0
  52. data/spec/source/expressions/string.lol +20 -0
  53. data/spec/source/expressions/string.out +7 -0
  54. data/spec/source/statements/assignment.lol +8 -0
  55. data/spec/source/statements/assignment.out +3 -0
  56. data/spec/source/statements/cast.lol +11 -0
  57. data/spec/source/statements/cast.out +3 -0
  58. data/spec/source/statements/declaration.lol +9 -0
  59. data/spec/source/statements/declaration.out +2 -0
  60. data/spec/source/statements/expression.lol +10 -0
  61. data/spec/source/statements/expression.out +2 -0
  62. data/spec/source/statements/if_then_else.lol +42 -0
  63. data/spec/source/statements/if_then_else.out +3 -0
  64. data/spec/source/statements/input.in +1 -0
  65. data/spec/source/statements/input.lol +4 -0
  66. data/spec/source/statements/input.out +1 -0
  67. data/spec/source/statements/loop.lol +50 -0
  68. data/spec/source/statements/loop.out +20 -0
  69. data/spec/source/statements/print.lol +7 -0
  70. data/spec/source/statements/print.out +2 -0
  71. data/spec/source/statements/switch.lol +95 -0
  72. data/spec/source/statements/switch.out +12 -0
  73. data/spec/tokenizer_spec.rb +105 -0
  74. metadata +135 -0
@@ -0,0 +1 @@
1
+ Alisa
@@ -0,0 +1,50 @@
1
+ HAI 1.2
2
+
3
+ I HAS A i ITZ 1
4
+ IM IN YR foreverloop
5
+ VISIBLE i
6
+ BOTH SAEM i AN 3, O RLY?
7
+ YA RLY
8
+ GTFO
9
+ OIC
10
+ i R SUM OF i AN 1
11
+ IM OUTTA YR foreverloop
12
+
13
+ IM IN YR loop UPPIN YR counter
14
+ VISIBLE counter
15
+ BOTH SAEM counter AN 3
16
+ O RLY?
17
+ YA RLY
18
+ GTFO
19
+ OIC
20
+ IM OUTTA YR loop
21
+
22
+ IM IN YR loop NERFIN YR counter
23
+ VISIBLE counter
24
+ BOTH SAEM counter AN -2
25
+ O RLY?
26
+ YA RLY
27
+ GTFO
28
+ OIC
29
+ IM OUTTA YR loop
30
+
31
+ BTW for (int counter = 0; counter <= 3; counter++)
32
+ IM IN YR loop UPPIN YR counter WILE BOTH SAEM counter AN SMALLR OF counter AN 3
33
+ VISIBLE counter
34
+ IM OUTTA YR loop
35
+
36
+ BTW for (int counter = 0; counter > -3; counter--)
37
+ IM IN YR loop NERFIN YR counter TIL BOTH SAEM counter AN SMALLR OF counter AN -3
38
+ VISIBLE counter
39
+ IM OUTTA YR loop
40
+
41
+ HOW DUZ I threePlus YR var
42
+ FOUND YR SUM OF 3 AN var
43
+ IF U SAY SO
44
+
45
+ BTW using custom unary function to change loop variable
46
+ IM IN YR loop threePlus YR counter TIL BOTH SAEM counter AN 9
47
+ VISIBLE counter
48
+ IM OUTTA YR loop
49
+
50
+ KTHXBYE
@@ -0,0 +1,20 @@
1
+ 1
2
+ 2
3
+ 3
4
+ 0
5
+ 1
6
+ 2
7
+ 3
8
+ 0
9
+ -1
10
+ -2
11
+ 0
12
+ 1
13
+ 2
14
+ 3
15
+ 0
16
+ -1
17
+ -2
18
+ 0
19
+ 3
20
+ 6
@@ -0,0 +1,7 @@
1
+ HAI 1.2
2
+ VISIBLE "Hello"
3
+ BTW Exclamation mark at the end suppresses newline character
4
+ VISIBLE "world"!
5
+ VISIBLE " is"!
6
+ VISIBLE " wonderful!"
7
+ KTHXBYE
@@ -0,0 +1,2 @@
1
+ Hello
2
+ world is wonderful!
@@ -0,0 +1,95 @@
1
+ HAI 1.2
2
+
3
+ I HAS A color ITZ "R"
4
+ VISIBLE color
5
+ color, WTF?
6
+ OMG "R"
7
+ VISIBLE "RED FISH"
8
+ GTFO
9
+ OMG "Y"
10
+ VISIBLE "YELLOW FISH"
11
+ OMG "G"
12
+ OMG "B"
13
+ VISIBLE "FISH HAS A FLAVOR"
14
+ GTFO
15
+ OMGWTF
16
+ VISIBLE "FISH IS TRANSPARENT"
17
+ OIC
18
+
19
+ color R "Y"
20
+ VISIBLE color
21
+ color, WTF?
22
+ OMG "R"
23
+ VISIBLE "RED FISH"
24
+ GTFO
25
+ OMG "Y"
26
+ VISIBLE "YELLOW FISH"
27
+ OMG "G"
28
+ OMG "B"
29
+ VISIBLE "FISH HAS A FLAVOR"
30
+ GTFO
31
+ OMGWTF
32
+ VISIBLE "FISH IS TRANSPARENT"
33
+ OIC
34
+
35
+ color R "G"
36
+ VISIBLE color
37
+ color, WTF?
38
+ OMG "R"
39
+ VISIBLE "RED FISH"
40
+ GTFO
41
+ OMG "Y"
42
+ VISIBLE "YELLOW FISH"
43
+ OMG "G"
44
+ OMG "B"
45
+ VISIBLE "FISH HAS A FLAVOR"
46
+ GTFO
47
+ OMGWTF
48
+ VISIBLE "FISH IS TRANSPARENT"
49
+ OIC
50
+
51
+ color R "B"
52
+ VISIBLE color
53
+ color, WTF?
54
+ OMG "R"
55
+ VISIBLE "RED FISH"
56
+ GTFO
57
+ OMG "Y"
58
+ VISIBLE "YELLOW FISH"
59
+ OMG "G"
60
+ OMG "B"
61
+ VISIBLE "FISH HAS A FLAVOR"
62
+ GTFO
63
+ OMGWTF
64
+ VISIBLE "FISH IS TRANSPARENT"
65
+ OIC
66
+
67
+ color R "N"
68
+ VISIBLE color
69
+ color, WTF?
70
+ OMG "R"
71
+ VISIBLE "RED FISH"
72
+ GTFO
73
+ OMG "Y"
74
+ VISIBLE "YELLOW FISH"
75
+ OMG "G"
76
+ OMG "B"
77
+ VISIBLE "FISH HAS A FLAVOR"
78
+ GTFO
79
+ OMGWTF
80
+ VISIBLE "FISH IS TRANSPARENT"
81
+ OIC
82
+
83
+ BTW switch expressions should match both the type and value of IT variable
84
+ I HAS A str ITZ "5"
85
+ str, WTF?
86
+ OMG 5
87
+ VISIBLE "str is 5"
88
+ GTFO
89
+ OMG 5.0
90
+ VISIBLE "str is 5.0"
91
+ GTFO
92
+ OMG "5"
93
+ VISIBLE "str is '5'"
94
+ OIC
95
+ KTHXBYE
@@ -0,0 +1,12 @@
1
+ R
2
+ RED FISH
3
+ Y
4
+ YELLOW FISH
5
+ FISH HAS A FLAVOR
6
+ G
7
+ FISH HAS A FLAVOR
8
+ B
9
+ FISH HAS A FLAVOR
10
+ N
11
+ FISH IS TRANSPARENT
12
+ str is '5'
@@ -0,0 +1,105 @@
1
+ require 'stringio'
2
+
3
+ require 'minitest/autorun'
4
+ require 'layo'
5
+
6
+ include Layo
7
+
8
+ describe Tokenizer do
9
+ before do
10
+ @lexer = Lexer.new(StringIO.new)
11
+ @tokenizer = Tokenizer.new(@lexer)
12
+ end
13
+
14
+ it 'should recognize all plain tokens' do
15
+ tokens = {}
16
+ ['HAI', 'KTHXBYE', 'NOOB', 'TROOF', 'NUMBR', 'NUMBAR',
17
+ 'YARN', 'I HAS A', 'ITZ', 'R', 'SUM OF', 'DIFF OF', 'PRODUKT OF',
18
+ 'QUOSHUNT OF', 'MOD OF', 'BIGGR OF', 'SMALLR OF', 'BOTH OF', 'EITHER OF',
19
+ 'WON OF', 'NOT', 'ALL OF', 'ANY OF', 'BOTH SAEM', 'DIFFRINT',
20
+ 'SMOOSH', 'MAEK', 'IS NOW A', 'A', 'VISIBLE', 'GIMMEH', 'MKAY', 'AN',
21
+ 'O RLY?', 'YA RLY', 'NO WAI', 'MEBBE', 'OIC', 'WTF?', 'OMG', 'OMGWTF',
22
+ 'GTFO', 'IM IN YR', 'YR', 'TIL', 'WILE', 'IM OUTTA YR', 'UPPIN',
23
+ 'NERFIN', 'HOW DUZ I', 'AN YR', 'IF U SAY SO', 'FOUND YR'
24
+ ].each { |t| tokens[t.gsub(' ', '_').downcase.to_sym] = t.split(' ') }
25
+ tokens.each do |type, value|
26
+ # Assign line number and position to each lexeme
27
+ value.map! { |item| [item, 1, 1] }
28
+ lexer = Lexer.new(StringIO.new)
29
+ lexer.stubs(:next_item).returns(*value)
30
+ @tokenizer.lexer = lexer
31
+ @tokenizer.next[:type].must_equal type
32
+ end
33
+ end
34
+
35
+ it 'should recognize newline tokens' do
36
+ @lexer.stubs(:next_item).returns(["\n", 1, 1])
37
+ @tokenizer.next[:type].must_equal :newline
38
+ end
39
+
40
+ it' should recognize exclamation mark token' do
41
+ @lexer.stubs(:next_item).returns ['!', 1, 1]
42
+ @tokenizer.next[:type].must_equal :exclamation
43
+ end
44
+
45
+ it 'should recognize string tokens' do
46
+ @lexer.stubs(:next_item).returns ['"some string lexeme"', 1, 1]
47
+ token = @tokenizer.next
48
+ token[:type].must_equal :string
49
+ token[:data].must_equal 'some string lexeme'
50
+ end
51
+
52
+ it 'should recognize float tokens' do
53
+ [0.255, -1234.02].each do |number|
54
+ @lexer.stubs(:next_item).returns [number.to_s, 1, 1]
55
+ token = @tokenizer.next
56
+ token[:type].must_equal :float
57
+ token[:data].must_equal number
58
+ end
59
+ end
60
+
61
+ it 'should recognize integer tokens' do
62
+ [25, -9, 0].each do |number|
63
+ @lexer.stubs(:next_item).returns [number.to_s, 1, 1]
64
+ token = @tokenizer.next
65
+ token[:type].must_equal :integer
66
+ token[:data].must_equal number
67
+ end
68
+ end
69
+
70
+ it 'should recognize boolean tokens' do
71
+ ['WIN', 'FAIL'].each do |value|
72
+ @lexer.stubs(:next_item).returns [value, 1, 1]
73
+ token = @tokenizer.next
74
+ token[:type].must_equal :boolean
75
+ token[:data].must_equal (value == 'WIN')
76
+ end
77
+ end
78
+
79
+ it 'should recognize identifier tokens' do
80
+ ['layo', 'lAYO123', 'Layo_layo_3'].each do |value|
81
+ @lexer.stubs(:next_item).returns [value, 1, 1]
82
+ token = @tokenizer.next
83
+ token[:type].must_equal :identifier
84
+ token[:data].must_equal value
85
+ end
86
+ end
87
+
88
+ it 'should return eof token if lexeme is nil' do
89
+ @lexer.stubs(:next_item).returns [nil, 1, 1]
90
+ @tokenizer.next[:type].must_equal :eof
91
+ end
92
+
93
+ it 'should raise exception if token is unknown' do
94
+ ['abc:', '%sdf', '- 25', '-', '.333'].each do |value|
95
+ @lexer.stubs(:next_item).returns [value, 1, 1]
96
+ lambda { @tokenizer.next }.must_raise Layo::UnknownTokenError
97
+ end
98
+ end
99
+
100
+ it 'should consume all lexemes of multi-lexeme token' do
101
+ @lexer.stubs(:next_item).returns(['ALL', 1, 1], ['OF', 1, 1], ['NOOB', 1, 1])
102
+ @tokenizer.next[:type].must_equal :all_of
103
+ @tokenizer.next[:type].must_equal :noob
104
+ end
105
+ end
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: layo
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Galymzhan Kozhayev
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: mocha
16
+ requirement: &78148240 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.10.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *78148240
25
+ description: ! " Layo is a LOLCODE interpreter written in plain Ruby. It tries
26
+ to conform to\n the LOLCODE 1.2 specification and supports everything described
27
+ there.\n"
28
+ email: kozhayev@gmail.com
29
+ executables:
30
+ - layo
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - LICENSE
35
+ - README.mkd
36
+ - Rakefile
37
+ - UnicodeData.txt
38
+ - bin/layo
39
+ - layo.gemspec
40
+ - lib/layo.rb
41
+ - lib/layo/ast.rb
42
+ - lib/layo/ast/block.rb
43
+ - lib/layo/ast/expression.rb
44
+ - lib/layo/ast/node.rb
45
+ - lib/layo/ast/program.rb
46
+ - lib/layo/ast/statement.rb
47
+ - lib/layo/interpreter.rb
48
+ - lib/layo/lexer.rb
49
+ - lib/layo/parser.rb
50
+ - lib/layo/peekable.rb
51
+ - lib/layo/runtime_error.rb
52
+ - lib/layo/syntax_error.rb
53
+ - lib/layo/tokenizer.rb
54
+ - lib/layo/unexpected_token_error.rb
55
+ - lib/layo/unicode.rb
56
+ - lib/layo/unknown_token_error.rb
57
+ - spec/interpreter_spec.rb
58
+ - spec/lexer_spec.rb
59
+ - spec/parser_spec.rb
60
+ - spec/source/basic/comments.lol
61
+ - spec/source/basic/comments.out
62
+ - spec/source/basic/line-continuation.lol
63
+ - spec/source/basic/line-continuation.out
64
+ - spec/source/basic/line-endings.lol
65
+ - spec/source/basic/line-endings.out
66
+ - spec/source/basic/minimal.lol
67
+ - spec/source/casting/boolean.lol
68
+ - spec/source/casting/boolean.out
69
+ - spec/source/casting/float.lol
70
+ - spec/source/casting/float.out
71
+ - spec/source/casting/int.lol
72
+ - spec/source/casting/int.out
73
+ - spec/source/casting/nil.lol
74
+ - spec/source/casting/nil.out
75
+ - spec/source/casting/string.lol
76
+ - spec/source/casting/string.out
77
+ - spec/source/expressions/boolean.lol
78
+ - spec/source/expressions/boolean.out
79
+ - spec/source/expressions/cast.lol
80
+ - spec/source/expressions/cast.out
81
+ - spec/source/expressions/function.lol
82
+ - spec/source/expressions/function.out
83
+ - spec/source/expressions/math.lol
84
+ - spec/source/expressions/math.out
85
+ - spec/source/expressions/string.lol
86
+ - spec/source/expressions/string.out
87
+ - spec/source/statements/assignment.lol
88
+ - spec/source/statements/assignment.out
89
+ - spec/source/statements/cast.lol
90
+ - spec/source/statements/cast.out
91
+ - spec/source/statements/declaration.lol
92
+ - spec/source/statements/declaration.out
93
+ - spec/source/statements/expression.lol
94
+ - spec/source/statements/expression.out
95
+ - spec/source/statements/if_then_else.lol
96
+ - spec/source/statements/if_then_else.out
97
+ - spec/source/statements/input.in
98
+ - spec/source/statements/input.lol
99
+ - spec/source/statements/input.out
100
+ - spec/source/statements/loop.lol
101
+ - spec/source/statements/loop.out
102
+ - spec/source/statements/print.lol
103
+ - spec/source/statements/print.out
104
+ - spec/source/statements/switch.lol
105
+ - spec/source/statements/switch.out
106
+ - spec/tokenizer_spec.rb
107
+ homepage: http://github.com/galymzhan/layo
108
+ licenses: []
109
+ post_install_message:
110
+ rdoc_options: []
111
+ require_paths:
112
+ - lib
113
+ required_ruby_version: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: 1.9.2
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ none: false
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ requirements: []
126
+ rubyforge_project:
127
+ rubygems_version: 1.8.12
128
+ signing_key:
129
+ specification_version: 3
130
+ summary: LOLCODE interpreter written in plain Ruby
131
+ test_files:
132
+ - spec/interpreter_spec.rb
133
+ - spec/lexer_spec.rb
134
+ - spec/parser_spec.rb
135
+ - spec/tokenizer_spec.rb