X-Git-Url: http://nitlanguage.org diff --git a/src/parser/xss/parser.xss b/src/parser/xss/parser.xss index c4df56c..3ca1bcd 100644 --- a/src/parser/xss/parser.xss +++ b/src/parser/xss/parser.xss @@ -21,12 +21,12 @@ $ template make_parser() # State of the parser automata as stored in the parser stack. private class State # The internal state number - readable writable attr _state: Int + readable writable var _state: Int # The node stored with the state in the stack - readable writable attr _nodes: Object + readable writable var _nodes: nullable Object - init(state: Int, nodes: Object) + init(state: Int, nodes: nullable Object) do _state = state _nodes = nodes @@ -36,13 +36,13 @@ end class Parser special ParserTable # Associated lexer - attr _lexer: Lexer + var _lexer: Lexer # Stack of pushed states and productions - attr _stack: Array[State] + var _stack: Array[State] # Position in the stack - attr _stack_pos: Int + var _stack_pos: Int # Create a new parser based on a given lexer init(lexer: Lexer) @@ -56,7 +56,7 @@ special ParserTable end # Do a transition in the automata - private meth go_to(index: Int): Int + private fun go_to(index: Int): Int do var state = state var table = _goto_table[index] @@ -80,7 +80,7 @@ special ParserTable end # Push someting in the state stack - private meth push(numstate: Int, list_node: Object) + private fun push(numstate: Int, list_node: nullable Object) do var pos = _stack_pos + 1 _stack_pos = pos @@ -94,13 +94,13 @@ special ParserTable end # The current state - private meth state: Int + private fun state: Int do return _stack[_stack_pos].state end # Pop something from the stack state - private meth pop: Object + private fun pop: nullable Object do var res = _stack[_stack_pos].nodes _stack_pos = _stack_pos -1 @@ -108,11 +108,10 @@ special ParserTable end # Build and return a full AST. - meth parse: Start + fun parse: Start do push(0, null) - var ign: List[Token] = null var lexer = _lexer while true do var token = lexer.peek @@ -120,7 +119,6 @@ special ParserTable var last_line = token.line if token isa PError then - assert token isa PError return new Start(null, token) end @@ -165,11 +163,11 @@ special ParserTable return node end end - return null + abort end - attr _reduce_table: Array[ReduceAction] - private meth build_reduce_table + var _reduce_table: Array[ReduceAction] + private fun build_reduce_table do _reduce_table = new Array[ReduceAction].with_items( $ foreach {rules/rule} @@ -182,12 +180,13 @@ end # Find first and last tokens of production nodes private class SearchTokensVisitor special Visitor - attr _untokenned_nodes: Array[Prod] - attr _last_token: Token - redef meth visit(n: PNode) + var _untokenned_nodes: Array[Prod] + var _last_token: nullable Token = null + redef fun visit(n: nullable PNode) do - if n isa Token then - assert n isa Token + if n == null then + return + else if n isa Token then _last_token = n for no in _untokenned_nodes do no.first_token = n @@ -208,27 +207,27 @@ end # Each reduca action has its own class, this one is the root of the hierarchy. private abstract class ReduceAction - meth action(p: Parser) is abstract + fun action(p: Parser) is abstract end $ foreach {rules/rule} private class ReduceAction@index special ReduceAction - redef meth action(p: Parser) + redef fun action(p: Parser) do - var node_list: Object = null + var node_list: nullable Object = null $ foreach {action} $ choose $ when {@cmd='POP'} var ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} = p.pop $ end $ when {@cmd='FETCHLIST'} - var ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} = ${translate(@from,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} + var ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} = ${translate(@from,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} assert ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} isa Array[Object] $ end $ when {@cmd='FETCHNODE'} var ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} = ${translate(@from,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} - assert ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} isa @etype + assert ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} isa nullable @etype $ end $ when {@cmd='ADDNODE'} if ${translate(@node,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} != null then @@ -236,19 +235,19 @@ $ when {@cmd='ADDNODE'} end $ end $ when {@cmd='ADDLIST'} - if ${translate(@fromlist,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} != null then +# if ${translate(@fromlist,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} != null then if ${translate(@tolist,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}.is_empty then ${translate(@tolist,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} = ${translate(@fromlist,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} else ${translate(@tolist,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}.append(${translate(@fromlist,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}) end - end +# end $ end $ when {@cmd='MAKELIST'} var ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} = new Array[Object] $ end $ when {@cmd='MAKENODE'} - var ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} = new @etype.init_${translate(@etype,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}( + var ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}: nullable @etype = new @etype.init_${translate(@etype,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}( $ foreach {arg} $ if @null null[-sep ','-] @@ -280,8 +279,8 @@ $ end template $ template make_parser_tables() # Parser that build a full AST abstract class ParserTable - attr _action_table: Array[Array[Int]] = null - private meth build_action_table + var _action_table: Array[Array[Int]] + private fun build_action_table do _action_table = once [ $ foreach {parser_data/action_table/row} @@ -291,7 +290,7 @@ $ end foreach end $ foreach {parser_data/action_table/row} - private meth action_table_row${position()}: Array[Int] + private fun action_table_row${position()}: Array[Int] do return [ $ foreach {action} @@ -301,8 +300,8 @@ $ end foreach end $ end foreach - attr _goto_table: Array[Array[Int]] = null - private meth build_goto_table + var _goto_table: Array[Array[Int]] + private fun build_goto_table do _goto_table = once [ $ foreach {parser_data/goto_table/row} @@ -315,7 +314,7 @@ $ end foreach ] end - private meth error_messages: Array[String] + private fun error_messages: Array[String] do return once [ $ foreach {parser_data/error_messages/msg} @@ -324,11 +323,13 @@ $ end ] end - private meth errors: Array[Int] + private fun errors: Array[Int] do return once [ [-foreach {parser_data/errors/i}-]${.} [-sep ','-] [-end-] ] end + + init do end end $ end template