mirror of
https://github.com/jashkenas/coffeescript.git
synced 2022-11-09 12:23:24 -05:00
added nice syntax errors
This commit is contained in:
parent
1590713576
commit
1eec05d23a
6 changed files with 56 additions and 8 deletions
2
TODO
2
TODO
|
@ -1,7 +1,5 @@
|
||||||
TODO:
|
TODO:
|
||||||
|
|
||||||
* Need *way* better syntax errors.
|
|
||||||
|
|
||||||
* Is it possible to close blocks (functions, ifs, trys) without an explicit
|
* Is it possible to close blocks (functions, ifs, trys) without an explicit
|
||||||
block delimiter or significant whitespace?
|
block delimiter or significant whitespace?
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,20 @@
|
||||||
# Identifiers run together:
|
# Identifiers run together:
|
||||||
a b c
|
# a b c
|
||||||
|
|
||||||
|
# Trailing comma in array:
|
||||||
|
# array: [1, 2, 3, 4, 5,]
|
||||||
|
|
||||||
|
# Unterminated object literal:
|
||||||
|
# obj: { one: 1, two: 2
|
||||||
|
|
||||||
|
# Numbers run together:
|
||||||
|
# 101 202
|
||||||
|
|
||||||
|
# Strings run together:
|
||||||
|
# str: "broken" "words"
|
||||||
|
|
||||||
|
# Forgot to terminate a function:
|
||||||
|
# obj: {
|
||||||
|
# first: a => a[0].
|
||||||
|
# last: a => a[a.length-1]
|
||||||
|
# }
|
|
@ -1,9 +1,10 @@
|
||||||
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
||||||
require "coffee_script/value"
|
|
||||||
require "coffee_script/scope"
|
|
||||||
require "coffee_script/lexer"
|
require "coffee_script/lexer"
|
||||||
require "coffee_script/parser"
|
require "coffee_script/parser"
|
||||||
require "coffee_script/nodes"
|
require "coffee_script/nodes"
|
||||||
|
require "coffee_script/value"
|
||||||
|
require "coffee_script/scope"
|
||||||
|
require "coffee_script/parse_error"
|
||||||
|
|
||||||
# Namespace for all CoffeeScript internal classes.
|
# Namespace for all CoffeeScript internal classes.
|
||||||
module CoffeeScript
|
module CoffeeScript
|
||||||
|
|
|
@ -31,7 +31,7 @@ Usage:
|
||||||
def compile_javascript
|
def compile_javascript
|
||||||
@sources.each do |source|
|
@sources.each do |source|
|
||||||
next tokens(source) if @options[:tokens]
|
next tokens(source) if @options[:tokens]
|
||||||
contents = CoffeeScript.compile(File.open(source))
|
contents = compile(source)
|
||||||
next puts(contents) if @options[:print]
|
next puts(contents) if @options[:print]
|
||||||
next lint(contents) if @options[:lint]
|
next lint(contents) if @options[:lint]
|
||||||
File.open(path_for(source), 'w+') {|f| f.write(contents) }
|
File.open(path_for(source), 'w+') {|f| f.write(contents) }
|
||||||
|
@ -60,6 +60,15 @@ Usage:
|
||||||
puts Lexer.new.tokenize(File.read(source)).inspect
|
puts Lexer.new.tokenize(File.read(source)).inspect
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def compile(source)
|
||||||
|
begin
|
||||||
|
CoffeeScript.compile(File.open(source))
|
||||||
|
rescue CoffeeScript::ParseError => e
|
||||||
|
STDERR.puts e.message(source)
|
||||||
|
exit(1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Write out JavaScript alongside CoffeeScript unless an output directory
|
# Write out JavaScript alongside CoffeeScript unless an output directory
|
||||||
# is specified.
|
# is specified.
|
||||||
def path_for(source)
|
def path_for(source)
|
||||||
|
|
|
@ -294,13 +294,16 @@ rule
|
||||||
end
|
end
|
||||||
|
|
||||||
---- inner
|
---- inner
|
||||||
def parse(code, show_tokens=false)
|
def parse(code)
|
||||||
# @yydebug = true
|
# @yydebug = true
|
||||||
@tokens = Lexer.new.tokenize(code)
|
@tokens = Lexer.new.tokenize(code)
|
||||||
puts @tokens.inspect if show_tokens
|
|
||||||
do_parse
|
do_parse
|
||||||
end
|
end
|
||||||
|
|
||||||
def next_token
|
def next_token
|
||||||
@tokens.shift
|
@tokens.shift
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def on_error(error_token_id, error_value, value_stack)
|
||||||
|
raise CoffeeScript::ParseError.new(token_to_str(error_token_id), error_value, value_stack)
|
||||||
|
end
|
19
lib/coffee_script/parse_error.rb
Normal file
19
lib/coffee_script/parse_error.rb
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
module CoffeeScript
|
||||||
|
|
||||||
|
class ParseError < Racc::ParseError
|
||||||
|
|
||||||
|
def initialize(token_id, value, stack)
|
||||||
|
@token_id, @value, @stack = token_id, value, stack
|
||||||
|
end
|
||||||
|
|
||||||
|
def message(source_file=nil)
|
||||||
|
line = @value.respond_to?(:line) ? @value.line : "END"
|
||||||
|
line_part = source_file ? "#{source_file}:#{line}:" : "line #{line}:"
|
||||||
|
id_part = @token_id != @value.inspect ? ", unexpected #{@token_id.downcase}" : ""
|
||||||
|
"#{line_part} syntax error for '#{@value.to_s}'#{id_part}"
|
||||||
|
end
|
||||||
|
alias_method :inspect, :message
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
Loading…
Add table
Add a link
Reference in a new issue