From 8d1af508f4173e4af6a4ea98584c1a86619f6a20 Mon Sep 17 00:00:00 2001 From: Li Jin Date: Sat, 18 Jan 2020 18:15:24 +0800 Subject: fix Moonscript issue 122, add support for ? operator. --- src/MoonP/moon_parser.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'src/MoonP/moon_parser.cpp') diff --git a/src/MoonP/moon_parser.cpp b/src/MoonP/moon_parser.cpp index 1005463..7cc4129 100644 --- a/src/MoonP/moon_parser.cpp +++ b/src/MoonP/moon_parser.cpp @@ -289,9 +289,9 @@ extern rule Value; rule exp_op_value = Space >> BinaryOperator >> *SpaceBreak >> Value; rule Exp = Value >> *exp_op_value; -extern rule Chain, Callable, InvokeArgs; +extern rule Chain, Callable, InvokeArgs, existential_op; -rule ChainValue = Seperator >> (Chain | Callable) >> -InvokeArgs; +rule ChainValue = Seperator >> (Chain | Callable) >> -existential_op >> -InvokeArgs; extern rule KeyValue, String, SimpleValue; @@ -345,9 +345,10 @@ rule FnArgs = (symx('(') >> *SpaceBreak >> -FnArgsExpList >> *SpaceBreak >> sym( extern rule ChainItems, DotChainItem, ColonChain; -rule chain_call = (Callable | String) >> ChainItems; +rule existential_op = expr('?'); +rule chain_call = (Callable | String) >> -existential_op >> ChainItems; rule chain_item = and_(set(".\\")) >> ChainItems; -rule chain_dot_chain = DotChainItem >> -ChainItems; +rule chain_dot_chain = DotChainItem >> -existential_op >> -ChainItems; rule Chain = chain_call | chain_item | Space >> (chain_dot_chain | ColonChain); @@ -362,11 +363,11 @@ rule ChainItems = chain_with_colon | ColonChain; extern rule Invoke, Slice; rule Index = symx('[') >> Exp >> sym(']'); -rule ChainItem = Invoke | DotChainItem | Slice | Index; +rule ChainItem = Invoke >> -existential_op | DotChainItem >> -existential_op | Slice | Index >> -existential_op; rule DotChainItem = symx('.') >> Name; rule ColonChainItem = symx('\\') >> (LuaKeyword | Name); -rule invoke_chain = Invoke >> -ChainItems; -rule ColonChain = ColonChainItem >> -invoke_chain; +rule invoke_chain = Invoke >> -existential_op >> -ChainItems; +rule ColonChain = ColonChainItem >> -existential_op >> -invoke_chain; rule default_value = true_(); rule Slice = -- cgit v1.2.3-55-g6feb