sweet-lang 0.2.2 → 0.3.7

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.
@@ -1,3 +1,4 @@
1
+ require "lexer/files"
1
2
  require "lexer/tags"
2
3
  require "lexer/strings"
3
4
  require "lexer/core"
@@ -3,7 +3,9 @@ class Lexer
3
3
 
4
4
  def treat(code)
5
5
  tags = Tags.new
6
- code = tags.implement_tag(code)
6
+ strings = Strings.new
7
+ files = Files.new
8
+ code = strings.rollingback_strings(tags.implement_tag(files.includes(code)))
7
9
  end
8
10
 
9
11
  def tokenize(code)
@@ -14,11 +16,9 @@ class Lexer
14
16
  code = code.gsub( /[ ]+\n/, "\n" )
15
17
  code = code.gsub( "\n ", "\n\t" )
16
18
  code = code.gsub( /^\s*$/m, '' )
17
-
18
- tags = Tags.new
19
+ code = code.gsub( /^((\t)+)?\n/, '' )
19
20
 
20
21
  code = treat(code)
21
-
22
22
  # Current character position we're parsing
23
23
  i = 0
24
24
 
@@ -66,37 +66,50 @@ class Lexer
66
66
 
67
67
  # Here's the indentation magic!
68
68
  elsif indent = chunk[/\A\n(\t+)/m, 1]
69
- # Create a new block we expect the indent level to go up.
70
- if indent.size < current_indent
71
- indent_stack.pop
72
- current_indent = indent_stack.last || 0
73
- tokens << [:DEDENT, indent.size]
74
- tokens << [:NEWLINE, "\n"]
75
-
76
- elsif indent.size == current_indent
77
- tokens << [:NEWLINE, "\n"]
78
-
79
- else
80
- # Adjust the current indentation level.
81
- current_indent = indent.size
82
- indent_stack.push(current_indent)
83
- tokens << [:INDENT, indent.size]
84
- end
85
-
69
+ # p "-----------"
70
+ # p indent.size
71
+ # p current_indent
72
+ # Create a new block we expect the indent level to go up.
73
+ if indent.size < current_indent
74
+ while current_indent > indent.size
75
+ indent_stack.pop
76
+ current_indent = indent_stack.last || 0
77
+ tokens << [:DEDENT, indent.size]
78
+ tokens << [:NEWLINE, "\n"]
79
+ end
80
+
81
+ elsif indent.size == current_indent
82
+ tokens << [:NEWLINE, "\n"]
83
+
84
+ else
85
+ # Adjust the current indentation level.
86
+ current_indent = indent.size
87
+ indent_stack << current_indent
88
+ tokens << [:INDENT, indent.size]
89
+ end
90
+ # p tokens
91
+ # p "-----------"
92
+ # p "+++++#{current_indent}"
86
93
  i += indent.size + 1
87
-
88
94
  elsif indent = chunk[/\A\n( *)/m, 1]
95
+ # p "============"
96
+ # p indent.size
97
+ # p current_indent
89
98
  if indent.size == current_indent
90
99
  # Nothing to do, we're still in the same block
91
100
  tokens << [:NEWLINE, "\n"]
92
101
  elsif indent.size < current_indent
93
- indent_stack.pop
94
- current_indent = indent_stack.last || 0
95
- tokens << [:DEDENT, indent.size]
96
- tokens << [:NEWLINE, "\n"]
102
+ while current_indent > indent.size
103
+ indent_stack.pop
104
+ current_indent = indent_stack.last || 0
105
+ tokens << [:DEDENT, indent.size]
106
+ tokens << [:NEWLINE, "\n"]
107
+ end
97
108
  end
109
+ # p tokens
110
+ # p "============"
111
+ # p "+++++#{current_indent}"
98
112
  i += indent.size + 1
99
-
100
113
  # Match long operators such as ||, &&, ==, !=, <= and >=.
101
114
  # One character long operators are matched by the catch all `else` at the bottom.
102
115
  elsif operator = chunk[/\A(\|\||&&|==|!=|<=|>=)/, 1]
@@ -122,7 +135,9 @@ class Lexer
122
135
  while indent = indent_stack.pop
123
136
  tokens << [:DEDENT, indent_stack.last || 0]
124
137
  end
125
-
138
+ # p "================================"
139
+ # p tokens
140
+ # p "================================"
126
141
  tokens
127
142
  end
128
143
  end
@@ -0,0 +1,20 @@
1
+ class Files
2
+
3
+ def includes(code)
4
+ includes = code.scan(/(((\t)+)?<~([ .\/=-_a-zA-Z0-9]+))/)
5
+ includes.uniq!
6
+ includes.each do |include_|
7
+ result = ""
8
+ file_ = include_[3].gsub(" ", "")
9
+ indent = (include_[1].nil?) ? 0 : include_[1].count("\t")
10
+ indent = "\t" * indent
11
+ file_ = File.new("#{$path}#{file_}", "r")
12
+ while (line = file_.gets)
13
+ result += "#{indent}#{line}"
14
+ end
15
+ code = code.gsub(/^#{include_[0]}$/, result)
16
+ end
17
+ return code
18
+ end
19
+
20
+ end
@@ -1,7 +1,8 @@
1
1
  class Strings
2
2
 
3
- def convert_string(code, indent)
3
+ def convert_string(code, indent, defs=false)
4
4
  strings = code.scan(/\t("[^"]+")/m)
5
+ defs_back = code.scan(/\t(\/("[^"]+")\/)/m)
5
6
  strings.uniq!
6
7
  strings.each do |string|
7
8
  original_tabs = code.scan(/((\t)+)#{string[0]}/)
@@ -18,18 +19,35 @@ class Strings
18
19
  n_string = n_string.sub(/(\t)+/, "#{ '&nbsp;&nbsp;' * (actual_tab - original_tabs) }")
19
20
  end
20
21
  end
21
- new_string = "print(#{n_string})"
22
+ new_string = ( defs ) ? "/#{n_string}/" : "print(#{n_string})"
22
23
  code = code.gsub(string[0], new_string)
23
24
  end
24
25
  return code
25
26
  end
26
27
 
28
+ def treat_def(code)
29
+ defs = code.scan(/^(\t*)(def(()$| )(((\n)?[a-zA-Z0-9= _\-#.\\'\/\"]+)+)?(((\n)+?\1{1,}\t+)?(["#a= ()a-zA-Z0-9_.,\--\\'\/&]+)?)+)/)
30
+ defs.map! {|x| x[1]}
31
+ defs.each do |def_|
32
+ code = code.gsub(def_, convert_string( def_, 1, true ))
33
+ end
34
+ code
35
+ end
36
+
37
+ def rollingback_strings(code)
38
+ defs_back = code.scan(/\t(\/("[^"]+")\/)/m)
39
+ defs_back.each do |def_|
40
+ code = code.gsub(def_[0], def_[1])
41
+ end
42
+ code
43
+ end
44
+
27
45
  def fix_atr(code, indent)
28
46
  strings = code.scan(/print\(.*\)/m)
29
47
  strings.uniq!
30
48
  n_string = strings[0].gsub("\\=", "=")
31
49
  code = code.gsub(strings[0], n_string)
32
- return code
50
+ code
33
51
  end
34
52
 
35
53
  end
@@ -14,7 +14,7 @@ class Tags
14
14
  "var"]
15
15
 
16
16
  def convert_tag(code, index, indent, tag, atr, inline=false)
17
- content = code.scan(/(\t+[a-zA-Z0-9]+.*)/)
17
+ content = code.scan(/(\t+[\/"a-zA-Z0-9]+.*)/)
18
18
  tab = ""
19
19
  p_tab = ""
20
20
  for i in 0..indent
@@ -53,8 +53,8 @@ class Tags
53
53
  end
54
54
  orig.uniq!
55
55
  orig.each do |_old|
56
- _new = "#{a[0]}=#{_old[1]}"
57
- code = code.gsub(_old[0], _new)
56
+ _new = " #{a[0]}=#{_old[1]}"
57
+ code = code.gsub(/ #{_old[0]}/, _new)
58
58
  end
59
59
  end
60
60
  return code
@@ -80,15 +80,17 @@ class Tags
80
80
  end
81
81
  end
82
82
  @@tags.each do |tag|
83
- general = code.scan(/(^(#{tag}(()$| )([ :\/\?\+#.=_\-a-zA-Z0-9]+)?((\n\t.*)+)?).*)/m)
84
- general.map! {|x| x[0]}
83
+ general = code.scan(/(^(#{tag}(()$| )([ :;\/\?\+#.=_\-a-zA-Z0-9]+)?((\n\t.*)+)?).*)/)
84
+ general_old = general
85
+ general.map! {|x| x[1]}
86
+ general.uniq!
85
87
  general.each_with_index do |block, index|
86
88
  _code_block = block
87
89
  code_block = adding_attributes(block, tag)
88
- code_block = @strings.convert_string( code_block, indent )
89
- @@tags.each do |r_tag|
90
- if !code_block.scan(/^(\t){#{indent}}(#{r_tag}(()$| )((\n)+?[a-zA-Z0-9= \t_\-#.\\'\/]+)?(((\n)+?\1{#{indent+1},})?(["#a= ()a-zA-Z0-9_.,\--\\'\/&]+)?)+)/m).empty?
91
- r_code = code_block.scan(/^(\t){#{indent}}(#{r_tag}(()$| )((\n)+?[a-zA-Z0-9= \t_\-#.\\'\/]+)?(((\n)+?\1{#{indent+1},})?(["#a= ()a-zA-Z0-9_.,\--\\'\/&]+)?)+)/m)
90
+ code_block = @strings.treat_def(code_block)
91
+ @@tags.each do |r_tag|
92
+ if !code_block.scan(/^(\t){#{indent}}(#{r_tag}(()$| )(((\n)?[a-zA-Z0-9= _\-#.\\'\/\"]+)+)?(((\n)+?\1{#{indent+1},})?(["#a= ()a-zA-Z0-9_.,\--\\'\/&]+)?)+)/m).empty?
93
+ r_code = code_block.scan(/^(\t){#{indent}}(#{r_tag}(()$| )(((\n)?[a-zA-Z0-9= _\-#.\\'\/\"]+)+)?(((\n)+?\1{#{indent+1},})?(["\!\?#a= ()a-zA-Z0-9_.,\--\\'\/&]+)?)+)/m)
92
94
  r_code.each do |r|
93
95
  new_indent = indent + 1
94
96
  new_block = implement_tag(r[1], new_indent)
@@ -96,9 +98,12 @@ class Tags
96
98
  end
97
99
  end
98
100
  end
99
- atr = code_block.scan(/([a-zA-Z0-9_-]+=)([\.\/:a-zA-Z0-9_-]+)/)
101
+ atr = code_block.scan(/([a-zA-Z0-9_-]+=)([\.\/:;#a-zA-Z0-9_-]+)/)
102
+ code_block = @strings.convert_string( code_block, indent )
100
103
  code_block = convert_tag( code_block , index, indent, tag, atr)
101
- code = code.gsub(_code_block, code_block)
104
+ _code_block = _code_block.gsub("(", '\(')
105
+ _code_block = _code_block.gsub(")", '\)')
106
+ code = code.gsub(/^#{_code_block}$/m, code_block)
102
107
  end
103
108
  end
104
109
  code = @strings.fix_atr( code, indent )
@@ -10,7 +10,7 @@ class Sweet
10
10
  def parsing_options
11
11
 
12
12
  opts = Trollop::options do
13
- version "Sweet 0.1.9 (c) 2011 Joao Moura a.k.a D3TR1"
13
+ version "Sweet 0.3.7 (c) 2012 Joao Moura a.k.a D3TR1"
14
14
  banner <<-EOS
15
15
  A Sweet Language, that compiles for HTML.
16
16
 
@@ -49,7 +49,7 @@ class Sweet
49
49
  end
50
50
 
51
51
  def compile_file(file)
52
-
52
+ $path = file.split(/[ =-_a-zA-Z0-9]+\.s/)[0]
53
53
  interpreter = Interpreter.new
54
54
  @filename = file.split(".")[0]
55
55
  File.new("#{@filename}.html", "w")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sweet-lang
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-13 00:00:00.000000000Z
12
+ date: 2012-01-11 00:00:00.000000000Z
13
13
  dependencies: []
14
14
  description: ! "Sweet is a pre-compiled language based on Ruby and Python. \n Sweet
15
15
  makes possible to use all the class, defs, conditionals, global and \n local
@@ -31,6 +31,7 @@ files:
31
31
  - lib/lexer/core.rb
32
32
  - lib/lexer/strings.rb
33
33
  - lib/lexer/tags.rb
34
+ - lib/lexer/files.rb
34
35
  - lib/runtime/bootstrap.rb
35
36
  - lib/runtime/class.rb
36
37
  - lib/runtime/context.rb