Skip to content

Commit

Permalink
Showing 3 changed files with 193 additions and 193 deletions.
116 changes: 58 additions & 58 deletions lib/opal/parser/grammar.rb

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

170 changes: 85 additions & 85 deletions lib/opal/parser/grammar.y
Original file line number Diff line number Diff line change
@@ -7,32 +7,32 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__
k__FILE__ IDENTIFIER FID GVAR IVAR CONSTANT CVAR NTH_REF
BACK_REF STRING_CONTENT INTEGER FLOAT REGEXP_END '+@'
'-@' '-@NUM' '**' '<=>' '==' '===' '!=' '>=' '<=' '&&'
'||' '=~' '!~' '.' '..' '...' '[]' '[]=' '<<' '>>'
'::' '::@' OP_ASGN '=>' PAREN_BEG '(' ')' tLPAREN_ARG
ARRAY_BEG ']' tLBRACE tLBRACE_ARG SPLAT '*' '&@' '&'
'~' '%' '/' '+' '-' '<' '>' '|' '!' '^'
'-@' '-@NUM' tPOW tCMP tEQ tEQQ tNEQ tGEQ tLEQ tANDOP
tOROP tMATCH tNMATCH '.' tDOT2 tDOT3 '[]' '[]=' tLSHFT tRSHFT
'::' '::@' tOP_ASGN '=>' PAREN_BEG '(' ')' tLPAREN_ARG
ARRAY_BEG ']' tLBRACE tLBRACE_ARG SPLAT tSTAR2 '&@' tAMPER2
tTILDE tPERCENT tDIVIDE '+' '-' tLT tGT tPIPE tBANG tCARET
LCURLY '}' BACK_REF2 SYMBOL_BEG STRING_BEG XSTRING_BEG REGEXP_BEG
WORDS_BEG AWORDS_BEG STRING_DBEG STRING_DVAR STRING_END STRING
SYMBOL '\\n' '?' ':' ',' SPACE ';' LABEL LAMBDA LAMBEG kDO_LAMBDA
SYMBOL '\\n' tEH tCOLON ',' SPACE ';' LABEL LAMBDA LAMBEG kDO_LAMBDA

prechigh
right '!' '~' '+@'
right '**'
right tBANG tTILDE '+@'
right tPOW
right '-@NUM' '-@'
left '*' '/' '%'
left tSTAR2 tDIVIDE tPERCENT
left '+' '-'
left '<<' '>>'
left '&'
left '|' '^'
left '>' '>=' '<' '<='
nonassoc '<=>' '==' '===' '!=' '=~' '!~'
left '&&'
left '||'
nonassoc '..' '...'
right '?' ':'
left tLSHFT tRSHFT
left tAMPER2
left tPIPE tCARET
left tGT tGEQ tLT tLEQ
nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
left tANDOP
left tOROP
nonassoc tDOT2 tDOT3
right tEH tCOLON
left kRESCUE_MOD
right '=' OP_ASGN
right tEQL tOP_ASGN
nonassoc kDEFINED
right kNOT
left kOR kAND
@@ -126,38 +126,38 @@ stmt:
}
| klBEGIN LCURLY compstmt '}'
| klEND LCURLY compstmt '}'
| lhs '=' command_call
| lhs tEQL command_call
{
result = new_assign val[0], val[2]
}
| mlhs '=' command_call
| mlhs tEQL command_call
{
result = s(:masgn, val[0], s(:to_ary, val[2]))
}
| var_lhs OP_ASGN command_call
| var_lhs tOP_ASGN command_call
{
result = new_op_asgn val[1].intern, val[0], val[2]
}
| primary_value '[@' aref_args ']' OP_ASGN command_call
| primary_value '[@' aref_args ']' tOP_ASGN command_call
# {
# result = OpAsgnNode.new(val[4], ArefNode.new(val[0], val[2]), val[5])
# }
| primary_value '.' IDENTIFIER OP_ASGN command_call
| primary_value '.' IDENTIFIER tOP_ASGN command_call
{
result = s(:op_asgn2, val[0], "#{val[2]}=".intern, val[3].intern, val[4])
}
| primary_value '.' CONSTANT OP_ASGN command_call
| primary_value '::' IDENTIFIER OP_ASGN command_call
| backref OP_ASGN command_call
| lhs '=' mrhs
| primary_value '.' CONSTANT tOP_ASGN command_call
| primary_value '::' IDENTIFIER tOP_ASGN command_call
| backref tOP_ASGN command_call
| lhs tEQL mrhs
{
result = new_assign val[0], s(:svalue, val[2])
}
| mlhs '=' arg_value
| mlhs tEQL arg_value
{
result = s(:masgn, val[0], s(:to_ary, val[2]))
}
| mlhs '=' mrhs
| mlhs tEQL mrhs
{
result = s(:masgn, val[0], val[2])
}
@@ -180,7 +180,7 @@ expr:
result = s(:not, val[1])
result.line = val[1].line
}
| '!' command_call
| tBANG command_call
{
result = s(:not, val[1])
}
@@ -421,11 +421,11 @@ undef_list:
}

op:
'|' | '^' | '&' | '<=>' | '==' | '==='
| '=~' | '>' | '>=' | '<' | '<=' | '<<'
| '>>' | '+' | '-' | '*' | SPLAT | '/'
| '%' | '**' | '~' | '+@' | '-@' | '[]'
| '[]=' | BACK_REF2 | '!' | '!='
tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ
| tMATCH | tGT | tGEQ | tLT | tLEQ | tLSHFT
| tRSHFT | '+' | '-' | tSTAR2 | SPLAT | tDIVIDE
| tPERCENT | tPOW | tTILDE | '+@' | '-@' | '[]'
| '[]=' | BACK_REF2 | tBANG | tNEQ

reswords:
k__LINE__ | k__FILE__ | klBEGIN | klEND | kALIAS | kAND
@@ -438,40 +438,40 @@ reswords:
| kIF | kWHILE | kUNTIL | kUNLESS

arg:
lhs '=' arg
lhs tEQL arg
{
result = new_assign val[0], val[2]
}
| lhs '=' arg kRESCUE_MOD arg
| lhs tEQL arg kRESCUE_MOD arg
{
result = new_assign val[0], s(:rescue_mod, val[2], val[4])
}
| var_lhs OP_ASGN arg
| var_lhs tOP_ASGN arg
{
result = new_op_asgn val[1].intern, val[0], val[2]
}
| primary_value '[@' aref_args ']' OP_ASGN arg
| primary_value '[@' aref_args ']' tOP_ASGN arg
{
args = val[2]
args.type = :arglist if args.type == :array
result = s(:op_asgn1, val[0], val[2], val[4].intern, val[5])
result.line = val[0].line
}
| primary_value '.' IDENTIFIER OP_ASGN arg
| primary_value '.' IDENTIFIER tOP_ASGN arg
{
result = s(:op_asgn2, val[0], "#{val[2]}=".intern, val[3].intern, val[4])
}
| primary_value '.' CONSTANT OP_ASGN arg
| primary_value '::' IDENTIFIER OP_ASGN arg
| primary_value '::' CONSTANT OP_ASGN arg
| '::@' CONSTANT OP_ASGN arg
| backref OP_ASGN arg
| arg '..' arg
| primary_value '.' CONSTANT tOP_ASGN arg
| primary_value '::' IDENTIFIER tOP_ASGN arg
| primary_value '::' CONSTANT tOP_ASGN arg
| '::@' CONSTANT tOP_ASGN arg
| backref tOP_ASGN arg
| arg tDOT2 arg
{
result = s(:dot2, val[0], val[2])
result.line = val[0].line
}
| arg '...' arg
| arg tDOT3 arg
{
result = s(:dot3, val[0], val[2])
result.line = val[0].line
@@ -484,24 +484,24 @@ arg:
{
result = new_call val[0], :"-", s(:arglist, val[2])
}
| arg '*' arg
| arg tSTAR2 arg
{
result = new_call val[0], :"*", s(:arglist, val[2])
}
| arg '/' arg
| arg tDIVIDE arg
{
result = new_call val[0], :"/", s(:arglist, val[2])
}
| arg '%' arg
| arg tPERCENT arg
{
result = new_call val[0], :"%", s(:arglist, val[2])
}
| arg '**' arg
| arg tPOW arg
{
result = new_call val[0], :"**", s(:arglist, val[2])
}
| '-@NUM' INTEGER '**' arg
| '-@NUM' FLOAT '**' arg
| '-@NUM' INTEGER tPOW arg
| '-@NUM' FLOAT tPOW arg
| '+@' arg
{
result = new_call val[1], :"+@", s(:arglist)
@@ -518,80 +518,80 @@ arg:
result = val[1]
end
}
| arg '|' arg
| arg tPIPE arg
{
result = new_call val[0], :"|", s(:arglist, val[2])
}
| arg '^' arg
| arg tCARET arg
{
result = new_call val[0], :"^", s(:arglist, val[2])
}
| arg '&' arg
| arg tAMPER2 arg
{
result = new_call val[0], :"&", s(:arglist, val[2])
}
| arg '<=>' arg
| arg tCMP arg
{
result = new_call val[0], :"<=>", s(:arglist, val[2])
}
| arg '>' arg
| arg tGT arg
{
result = new_call val[0], :">", s(:arglist, val[2])
}
| arg '>=' arg
| arg tGEQ arg
{
result = new_call val[0], :">=", s(:arglist, val[2])
}
| arg '<' arg
| arg tLT arg
{
result = new_call val[0], :"<", s(:arglist, val[2])
}
| arg '<=' arg
| arg tLEQ arg
{
result = new_call val[0], :"<=", s(:arglist, val[2])
}
| arg '==' arg
| arg tEQ arg
{
result = new_call val[0], :"==", s(:arglist, val[2])
}
| arg '===' arg
| arg tEQQ arg
{
result = new_call val[0], :"===", s(:arglist, val[2])
}
| arg '!=' arg
| arg tNEQ arg
{
result = s(:not, new_call(val[0], :"==", s(:arglist, val[2])))
}
| arg '=~' arg
| arg tMATCH arg
{
result = new_call val[0], :"=~", s(:arglist, val[2])
}
| arg '!~' arg
| arg tNMATCH arg
{
result = s(:not, new_call(val[0], :"=~", s(:arglist, val[2])))
}
| '!' arg
| tBANG arg
{
result = s(:not, val[1])
}
| '~' arg
| tTILDE arg
{
result = new_call val[1], :"~", s(:arglist)
}
| arg '<<' arg
| arg tLSHFT arg
{
result = new_call val[0], :"<<", s(:arglist, val[2])
}
| arg '>>' arg
| arg tRSHFT arg
{
result = new_call val[0], :">>", s(:arglist, val[2])
}
| arg '&&' arg
| arg tANDOP arg
{
result = s(:and, val[0], val[2])
result.line = val[0].line
}
| arg '||' arg
| arg tOROP arg
{
result = s(:or, val[0], val[2])
result.line = val[0].line
@@ -600,7 +600,7 @@ arg:
{
result = s(:defined, val[2])
}
| arg '?' arg ':' arg
| arg tEH arg tCOLON arg
{
result = s(:if, val[0], val[2], val[4])
result.line = val[0].line
@@ -911,7 +911,7 @@ primary:
result.line = val[1]
result.end_line = lexer.line
}
| kCLASS '<<'
| kCLASS tLSHFT
{
result = lexer.line
}
@@ -981,13 +981,13 @@ primary_value:

then:
term
| ':'
| tCOLON
| kTHEN
| term kTHEN

do:
term
| ':'
| tCOLON
| kDO_COND

lambda:
@@ -1053,22 +1053,22 @@ f_block_optarg:
}

f_block_opt:
IDENTIFIER '=' primary_value
IDENTIFIER tEQL primary_value
{
result = new_assign new_assignable(s(:identifier, val[0].intern)), val[2]
}

opt_block_var:
none
| '|' '|'
| tPIPE tPIPE
{
result = 0
}
| '||'
| tOROP
{
result = 0
}
| '|' block_param '|'
| tPIPE block_param tPIPE
{
result = val[1]
}
@@ -1521,7 +1521,7 @@ superclass:
{
result = nil
}
| '<' expr_value term
| tLT expr_value term
{
result = val[1]
}
@@ -1649,7 +1649,7 @@ f_arg:
}

f_opt:
IDENTIFIER '=' arg_value
IDENTIFIER tEQL arg_value
{
result = new_assign new_assignable(s(:identifier, val[0].intern)), val[2]
}
@@ -1666,7 +1666,7 @@ f_optarg:
}

restarg_mark:
'*'
tSTAR2
| SPLAT

f_rest_arg:
@@ -1680,7 +1680,7 @@ f_rest_arg:
}

blkarg_mark:
'&'
tAMPER2
| '&@'

f_block_arg:
100 changes: 50 additions & 50 deletions lib/opal/parser/lexer.rb
Original file line number Diff line number Diff line change
@@ -489,7 +489,7 @@ def yylex
if scanner.scan(/\*/)
if scanner.scan(/\=/)
@lex_state = :expr_beg
return :OP_ASGN, '**'
return :tOP_ASGN, '**'
end

if @lex_state == :expr_fname or @lex_state == :expr_dot
@@ -498,18 +498,18 @@ def yylex
@lex_state = :expr_beg
end

return '**', '**'
return :tPOW, '**'

else
if scanner.scan(/\=/)
@lex_state = :expr_beg
return :OP_ASGN, '*'
return :tOP_ASGN, '*'
end
end

if scanner.scan(/\*\=/)
@lex_state = :expr_beg
return :OP_ASGN, '**'
return :tOP_ASGN, '**'
end

if scanner.scan(/\*/)
@@ -519,17 +519,17 @@ def yylex
@lex_state = :expr_beg
end

return '**', '**'
return :tPOW, '**'
end

if scanner.scan(/\=/)
@lex_state = :expr_beg
return :OP_ASGN, '*'
return :tOP_ASGN, '*'
else
result = '*'
if @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_arg
return '*', result
return :tSTAR2, result
elsif @space_seen && scanner.check(/\S/)
@lex_state = :expr_beg
return :SPLAT, result
@@ -538,7 +538,7 @@ def yylex
return :SPLAT, result
else
@lex_state = :expr_beg
return '*', result
return :tSTAR2, result
end
end

@@ -547,20 +547,20 @@ def yylex
if after_operator?
@lex_state = :expr_arg
if c == "@"
return '!', '!'
return :tBANG, '!'
end
else
@lex_state = :expr_beg
end

if c == '='
return '!=', '!='
return :tNEQ, '!='
elsif c == '~'
return '!~', '!~'
return :tNMATCH, '!~'
end

scanner.pos = scanner.pos - 1
return '!', '!'
return :tBANG, '!'

elsif scanner.scan(/\=/)
if @lex_state == :expr_beg and !@space_seen
@@ -596,19 +596,19 @@ def yylex

if scanner.scan(/\=/)
if scanner.scan(/\=/)
return '===', '==='
return :tEQQ, '==='
end

return '==', '=='
return :tEQ, '=='
end

if scanner.scan(/\~/)
return '=~', '=~'
return :tMATCH, '=~'
elsif scanner.scan(/\>/)
return '=>', '=>'
end

return '=', '='
return :tEQL, '='

elsif scanner.scan(/\"/)
self.strterm = { :type => :dquote, :beg => '"', :end => '"' }
@@ -627,14 +627,14 @@ def yylex
@lex_state = :expr_beg

if scanner.scan(/\=/)
return :OP_ASGN, '&&'
return :tOP_ASGN, '&&'
end

return '&&', '&&'
return :tANDOP, '&&'

elsif scanner.scan(/\=/)
@lex_state = :expr_beg
return :OP_ASGN, '&'
return :tOP_ASGN, '&'
end

if spcarg?
@@ -644,7 +644,7 @@ def yylex
result = '&@'
else
#puts "warn_balanced: & argument prefix"
result = '&'
result = :tAMPER2
end

@lex_state = after_operator? ? :expr_arg : :expr_beg
@@ -654,17 +654,17 @@ def yylex
if scanner.scan(/\|/)
@lex_state = :expr_beg
if scanner.scan(/\=/)
return :OP_ASGN, '||'
return :tOP_ASGN, '||'
end

return '||', '||'
return :tOROP, '||'

elsif scanner.scan(/\=/)
return :OP_ASGN, '|'
return :tOP_ASGN, '|'
end

@lex_state = after_operator?() ? :expr_arg : :expr_beg
return '|', '|'
return :tPIPE, '|'

elsif scanner.scan(/\%W/)
start_word = scanner.scan(/./)
@@ -705,7 +705,7 @@ def yylex
return :REGEXP_BEG, scanner.matched
elsif scanner.scan(/\=/)
@lex_state = :expr_beg
return :OP_ASGN, '/'
return :tOP_ASGN, '/'
elsif @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_arg
elsif @lex_state == :expr_cmdarg || @lex_state == :expr_arg
@@ -717,12 +717,12 @@ def yylex
@lex_state = :expr_beg
end

return '/', '/'
return :tDIVIDE, '/'

elsif scanner.scan(/\%/)
if scanner.scan(/\=/)
@lex_state = :expr_beg
return :OP_ASGN, '%'
return :tOP_ASGN, '%'
elsif scanner.check(/[^\s]/)
if @lex_state == :expr_beg or (@lex_state == :expr_arg && @space_seen)
start_word = scanner.scan(/./)
@@ -734,7 +734,7 @@ def yylex

@lex_state = after_operator? ? :expr_arg : :expr_beg

return '%', '%'
return :tPERCENT, '%'

elsif scanner.scan(/\\/)
if scanner.scan(/\r?\n/)
@@ -805,11 +805,11 @@ def yylex

elsif scanner.scan(/\.\.\./)
@lex_state = :expr_beg
return '...', scanner.matched
return :tDOT3, scanner.matched

elsif scanner.scan(/\.\./)
@lex_state = :expr_beg
return '..', scanner.matched
return :tDOT2, scanner.matched

elsif scanner.scan(/\./)
@lex_state = :expr_dot unless @lex_state == :expr_fname
@@ -831,7 +831,7 @@ def yylex
if end? || scanner.check(/\s/)
unless scanner.check(/\w/)
@lex_state = :expr_beg
return ':', ':'
return :tCOLON, ':'
end

@lex_state = :expr_fname
@@ -849,34 +849,34 @@ def yylex

elsif scanner.scan(/\^\=/)
@lex_state = :expr_beg
return :OP_ASGN, '^'
return :tOP_ASGN, '^'
elsif scanner.scan(/\^/)
if @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_arg
return '^', scanner.matched
return :tCARET, scanner.matched
end

@lex_state = :expr_beg
return '^', scanner.matched
return :tCARET, scanner.matched

elsif scanner.check(/\</)
if scanner.scan(/\<\<\=/)
@lex_state = :expr_beg
return :OP_ASGN, '<<'
return :tOP_ASGN, '<<'
elsif scanner.scan(/\<\</)
if @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_arg
return '<<', '<<'
return :tLSHFT, '<<'
elsif ![:expr_dot, :expr_class].include?(@lex_state) && !end? && (!arg? || @space_seen)
if token = heredoc_identifier
return token
end

@lex_state = :expr_beg
return '<<', '<<'
return :tLSHFT, '<<'
end
@lex_state = :expr_beg
return '<<', '<<'
return :tLSHFT, '<<'
elsif scanner.scan(/\<\=\>/)
if after_operator?
@lex_state = :expr_arg
@@ -888,47 +888,47 @@ def yylex
@lex_state = :expr_beg
end

return '<=>', '<=>'
return :tCMP, '<=>'
elsif scanner.scan(/\<\=/)
if @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_arg
else
@lex_state = :expr_beg
end
return '<=', '<='
return :tLEQ, '<='
elsif scanner.scan(/\</)
if @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_arg
else
@lex_state = :expr_beg
end
return '<', '<'
return :tLT, '<'
end

elsif scanner.check(/\>/)
if scanner.scan(/\>\>\=/)
return :OP_ASGN, '>>'
return :tOP_ASGN, '>>'
elsif scanner.scan(/\>\>/)
if @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_arg
else
@lex_state = :expr_beg
end
return '>>', '>>'
return :tRSHFT, '>>'
elsif scanner.scan(/\>\=/)
if @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_end
else
@lex_state = :expr_beg
end
return '>=', scanner.matched
return :tGEQ, scanner.matched
elsif scanner.scan(/\>/)
if @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_arg
else
@lex_state = :expr_beg
end
return '>', '>'
return :tGT, '>'
end

elsif scanner.scan(/->/)
@@ -952,7 +952,7 @@ def yylex

if scanner.scan(/\=/)
@lex_state = :expr_beg
return [:OP_ASGN, result]
return [:tOP_ASGN, result]
end

if @lex_state == :expr_cmdarg || @lex_state == :expr_arg
@@ -968,7 +968,7 @@ def yylex
elsif scanner.scan(/\?/)
if end?
@lex_state = :expr_beg
return '?', scanner.matched
return :tEH, scanner.matched
end

unless scanner.check(/\ |\t|\r|\s/)
@@ -977,15 +977,15 @@ def yylex
end

@lex_state = :expr_beg
return '?', scanner.matched
return :tEH, scanner.matched

elsif scanner.scan(/\~/)
if @lex_state == :expr_fname
@lex_state = :expr_end
return '~', '~'
return :tTILDE, '~'
end
@lex_state = :expr_beg
return '~', '~'
return :tTILDE, '~'

elsif scanner.check(/\$/)
if scanner.scan(/\$([1-9]\d*)/)

0 comments on commit 0471464

Please sign in to comment.