summaryrefslogtreecommitdiffstats
path: root/lib/puppet/parser/lexer.rb
diff options
context:
space:
mode:
authorluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2007-05-25 00:31:28 +0000
committerluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2007-05-25 00:31:28 +0000
commit62a4d4c91df2aa6e7a6f28dfdf81f95f28987216 (patch)
tree324aaf518981a1c6d4bf75b54c2119a82d76c0cf /lib/puppet/parser/lexer.rb
parent2b372df7038a268eee31372f62e8cf6be989b09e (diff)
downloadpuppet-62a4d4c91df2aa6e7a6f28dfdf81f95f28987216.tar.gz
puppet-62a4d4c91df2aa6e7a6f28dfdf81f95f28987216.tar.xz
puppet-62a4d4c91df2aa6e7a6f28dfdf81f95f28987216.zip
Adding better error reporting on unmatched brackets -- you will now get notification of what was expected in most cases
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@2531 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib/puppet/parser/lexer.rb')
-rw-r--r--lib/puppet/parser/lexer.rb32
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/puppet/parser/lexer.rb b/lib/puppet/parser/lexer.rb
index 9fc1f9a38..daa75f236 100644
--- a/lib/puppet/parser/lexer.rb
+++ b/lib/puppet/parser/lexer.rb
@@ -54,6 +54,16 @@ module Puppet
%r{\$(\w*::)*\w+} => :VARIABLE
}
+ @@pairs = {
+ "{" => "}",
+ "(" => ")",
+ "[" => "]",
+ "<|" => "|>",
+ "<<|" => "|>>"
+ }
+
+ @@reverse_pairs = @@pairs.inject({}) { |hash, pair| hash[pair[1]] = pair[0]; hash }
+
@@keywords = {
"case" => :CASE,
"class" => :CLASS,
@@ -76,6 +86,20 @@ module Puppet
initvars
end
+ def expected
+ if @expected.empty?
+ nil
+ else
+ token = @expected[-1]
+ @@tokens.each do |value, name|
+ if token == name
+ return value
+ end
+ end
+ return token
+ end
+ end
+
# scan the whole file
# basically just used for testing
def fullscan
@@ -130,6 +154,8 @@ module Puppet
@namestack = []
@indefine = false
+
+ @expected = []
end
# Go up one in the namespace.
@@ -247,6 +273,12 @@ module Puppet
value = value.sub(/^\$/, '')
end
+ if match = @@pairs[value] and ptoken != :DQUOTE and ptoken != :SQUOTE
+ @expected << match
+ elsif exp = @expected[-1] and exp == value and ptoken != :DQUOTE and ptoken != :SQUOTE
+ @expected.pop
+ end
+
yield [ptoken, value]
if @lasttoken == :CLASS