浏览代码

#line support

Nicolas Cannasse 17 年之前
父节点
当前提交
6f29f13053
共有 3 个文件被更改,包括 19 次插入7 次删除
  1. 1 0
      doc/CHANGES.txt
  2. 11 7
      lexer.mll
  3. 7 0
      parser.ml

+ 1 - 0
doc/CHANGES.txt

@@ -19,6 +19,7 @@
 	securized Hash for JS and Flash
 	securized Hash for JS and Flash
 	compiletime F9 class generation for F8 swflib
 	compiletime F9 class generation for F8 swflib
 	optimized for loops (Array and IntIter)
 	optimized for loops (Array and IntIter)
+	added #line support
 
 
 2007-10-31: 1.16
 2007-10-31: 1.16
 	use _sans font for default flash traces (better Linux support)
 	use _sans font for default flash traces (better Linux support)

+ 11 - 7
lexer.mll

@@ -41,6 +41,7 @@ let error_msg = function
 	| Invalid_option -> "Invalid regular expression option"
 	| Invalid_option -> "Invalid regular expression option"
 
 
 let cur_file = ref ""
 let cur_file = ref ""
+let cur_line = ref 1
 let all_lines = Hashtbl.create 0
 let all_lines = Hashtbl.create 0
 let lines = ref []
 let lines = ref []
 let buf = Buffer.create 100
 let buf = Buffer.create 100
@@ -60,6 +61,7 @@ let keywords =
 
 
 let init file =
 let init file =
 	cur_file := file;
 	cur_file := file;
+	cur_line := 1;
 	lines := []
 	lines := []
 
 
 let save_lines() =
 let save_lines() =
@@ -67,21 +69,23 @@ let save_lines() =
 
 
 let save() =
 let save() =
 	save_lines();
 	save_lines();
-	!cur_file
+	!cur_file, !cur_line
 
 
-let restore file =
+let restore (file,line) =
 	save_lines();
 	save_lines();
 	cur_file := file;
 	cur_file := file;
+	cur_line := line;
 	lines := Hashtbl.find all_lines file
 	lines := Hashtbl.find all_lines file
 
 
 let newline lexbuf =
 let newline lexbuf =
-	lines :=  (lexeme_end lexbuf) :: !lines
+	lines :=  (lexeme_end lexbuf,!cur_line) :: !lines;
+	incr cur_line
 
 
 let find_line p lines =
 let find_line p lines =
-	let rec loop n delta = function
-		| [] -> n , p - delta
-		| lp :: l when lp > p -> n , p - delta
-		| lp :: l -> loop (n+1) lp l
+	let rec loop line delta = function
+		| [] -> line + 1, p - delta
+		| (lp,line) :: l when lp > p -> line, p - delta
+		| (lp,line) :: l -> loop line lp l
 	in
 	in
 	loop 1 0 lines
 	loop 1 0 lines
 
 

+ 7 - 0
parser.ml

@@ -665,6 +665,13 @@ let parse code file =
 				process_token (skip_tokens false))
 				process_token (skip_tokens false))
 		| Macro "if" ->
 		| Macro "if" ->
 			process_token (enter_macro())
 			process_token (enter_macro())
+		| Macro "line" ->
+			let line = (match next_token() with
+				| (Const (Int s),_) -> int_of_string s
+				| (t,p) -> error (Unexpected t) p
+			) in
+			Lexer.cur_line := line;
+			next_token();
 		| _ ->
 		| _ ->
 			tk
 			tk