Skip to content

Commit ecbdd93

Browse files
committedNov 30, 2014
Add keyword arg parsing to lexer
1 parent 016887a commit ecbdd93

File tree

3 files changed

+2589
-2425
lines changed

3 files changed

+2589
-2425
lines changed
 

‎lib/opal/parser.rb

+7-2
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,11 @@ def new_paren(open, expr, close)
327327
end
328328
end
329329

330-
def new_args(norm, opt, rest, block)
330+
def new_args_tail(kwarg, kwrest, block)
331+
[kwarg, kwrest, block]
332+
end
333+
334+
def new_args(norm, opt, rest, tail)
331335
res = s(:args)
332336

333337
if norm
@@ -349,7 +353,8 @@ def new_args(norm, opt, rest, block)
349353
scope.add_local rest_str.to_sym unless rest_str.empty?
350354
end
351355

352-
if block
356+
if tail and tail[2]
357+
block = tail[2]
353358
res << block
354359
scope.add_local block.to_s[1..-1].to_sym
355360
end

‎lib/opal/parser/grammar.rb

+2,511-2,414
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎lib/opal/parser/grammar.y

+71-9
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
1515
tLCURLY tRCURLY tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG
1616
tWORDS_BEG tAWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END tSTRING
1717
tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA tLAMBEG
18-
tLBRACK2 tLBRACK
18+
tLBRACK2 tLBRACK tDSTAR
1919

2020
prechigh
2121
right tBANG tTILDE tUPLUS
@@ -1458,35 +1458,97 @@ xstring_contents: none
14581458
result = val[0]
14591459
}
14601460

1461-
f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_f_block_arg
1461+
kwrest_mark: tPOW
1462+
| tDSTAR
1463+
1464+
f_kwrest: kwrest_mark tIDENTIFIER
1465+
{
1466+
result = new_kwrestarg(val[1])
1467+
}
1468+
| kwrest_mark
1469+
{
1470+
result = new_kwrestarg()
1471+
}
1472+
1473+
f_label: tLABEL
1474+
{
1475+
result = new_sym(val[0])
1476+
}
1477+
1478+
f_kw: f_label arg_value
1479+
{
1480+
result = new_kwarg(val[0], val[1])
1481+
}
1482+
| f_label
1483+
{
1484+
result = new_kwoptarg(val[0])
1485+
}
1486+
1487+
f_kwarg: f_kw
1488+
{
1489+
result = [val[0]]
1490+
}
1491+
| f_kwarg tCOMMA f_kw
1492+
{
1493+
result = val[0]
1494+
result << val[2]
1495+
}
1496+
1497+
args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg
1498+
{
1499+
result = new_args_tail(val[0], val[2], val[3])
1500+
}
1501+
| f_kwarg opt_f_block_arg
1502+
{
1503+
result = new_args_tail(val[0], nil, val[1])
1504+
}
1505+
| f_kwrest opt_f_block_arg
1506+
{
1507+
result = new_args_tail(nil, val[0], val[1])
1508+
}
1509+
| f_block_arg
1510+
{
1511+
result = new_args_tail(nil, nil, val[0])
1512+
}
1513+
1514+
opt_args_tail: tCOMMA args_tail
1515+
{
1516+
result = val[1]
1517+
}
1518+
| # none
1519+
{
1520+
result = new_args_tail(nil, nil, nil)
1521+
}
1522+
1523+
f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail
14621524
{
14631525
result = new_args(val[0], val[2], val[4], val[5])
14641526
}
1465-
| f_arg tCOMMA f_optarg opt_f_block_arg
1527+
| f_arg tCOMMA f_optarg opt_args_tail
14661528
{
14671529
result = new_args(val[0], val[2], nil, val[3])
14681530
}
1469-
| f_arg tCOMMA f_rest_arg opt_f_block_arg
1531+
| f_arg tCOMMA f_rest_arg opt_args_tail
14701532
{
14711533
result = new_args(val[0], nil, val[2], val[3])
14721534
}
1473-
| f_arg opt_f_block_arg
1535+
| f_arg opt_args_tail
14741536
{
14751537
result = new_args(val[0], nil, nil, val[1])
14761538
}
1477-
| f_optarg tCOMMA f_rest_arg opt_f_block_arg
1539+
| f_optarg tCOMMA f_rest_arg opt_args_tail
14781540
{
14791541
result = new_args(nil, val[0], val[2], val[3])
14801542
}
1481-
| f_optarg opt_f_block_arg
1543+
| f_optarg opt_args_tail
14821544
{
14831545
result = new_args(nil, val[0], nil, val[1])
14841546
}
1485-
| f_rest_arg opt_f_block_arg
1547+
| f_rest_arg opt_args_tail
14861548
{
14871549
result = new_args(nil, nil, val[0], val[1])
14881550
}
1489-
| f_block_arg
1551+
| args_tail
14901552
{
14911553
result = new_args(nil, nil, nil, val[0])
14921554
}

0 commit comments

Comments
 (0)
Please sign in to comment.