diff options
author | Li Jin <dragon-fly@qq.com> | 2020-01-18 18:15:24 +0800 |
---|---|---|
committer | Li Jin <dragon-fly@qq.com> | 2020-01-18 18:15:24 +0800 |
commit | 8d1af508f4173e4af6a4ea98584c1a86619f6a20 (patch) | |
tree | 0264c4b01f1152d8114cf46aea6fd773276c0b01 /src/MoonP/moon_parser.cpp | |
parent | f53ccb373efbf6f6f40284111df309e351c2c18f (diff) | |
download | yuescript-8d1af508f4173e4af6a4ea98584c1a86619f6a20.tar.gz yuescript-8d1af508f4173e4af6a4ea98584c1a86619f6a20.tar.bz2 yuescript-8d1af508f4173e4af6a4ea98584c1a86619f6a20.zip |
fix Moonscript issue 122, add support for ? operator.
Diffstat (limited to 'src/MoonP/moon_parser.cpp')
-rw-r--r-- | src/MoonP/moon_parser.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
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; | |||
289 | rule exp_op_value = Space >> BinaryOperator >> *SpaceBreak >> Value; | 289 | rule exp_op_value = Space >> BinaryOperator >> *SpaceBreak >> Value; |
290 | rule Exp = Value >> *exp_op_value; | 290 | rule Exp = Value >> *exp_op_value; |
291 | 291 | ||
292 | extern rule Chain, Callable, InvokeArgs; | 292 | extern rule Chain, Callable, InvokeArgs, existential_op; |
293 | 293 | ||
294 | rule ChainValue = Seperator >> (Chain | Callable) >> -InvokeArgs; | 294 | rule ChainValue = Seperator >> (Chain | Callable) >> -existential_op >> -InvokeArgs; |
295 | 295 | ||
296 | extern rule KeyValue, String, SimpleValue; | 296 | extern rule KeyValue, String, SimpleValue; |
297 | 297 | ||
@@ -345,9 +345,10 @@ rule FnArgs = (symx('(') >> *SpaceBreak >> -FnArgsExpList >> *SpaceBreak >> sym( | |||
345 | 345 | ||
346 | extern rule ChainItems, DotChainItem, ColonChain; | 346 | extern rule ChainItems, DotChainItem, ColonChain; |
347 | 347 | ||
348 | rule chain_call = (Callable | String) >> ChainItems; | 348 | rule existential_op = expr('?'); |
349 | rule chain_call = (Callable | String) >> -existential_op >> ChainItems; | ||
349 | rule chain_item = and_(set(".\\")) >> ChainItems; | 350 | rule chain_item = and_(set(".\\")) >> ChainItems; |
350 | rule chain_dot_chain = DotChainItem >> -ChainItems; | 351 | rule chain_dot_chain = DotChainItem >> -existential_op >> -ChainItems; |
351 | 352 | ||
352 | rule Chain = chain_call | chain_item | | 353 | rule Chain = chain_call | chain_item | |
353 | Space >> (chain_dot_chain | ColonChain); | 354 | Space >> (chain_dot_chain | ColonChain); |
@@ -362,11 +363,11 @@ rule ChainItems = chain_with_colon | ColonChain; | |||
362 | extern rule Invoke, Slice; | 363 | extern rule Invoke, Slice; |
363 | 364 | ||
364 | rule Index = symx('[') >> Exp >> sym(']'); | 365 | rule Index = symx('[') >> Exp >> sym(']'); |
365 | rule ChainItem = Invoke | DotChainItem | Slice | Index; | 366 | rule ChainItem = Invoke >> -existential_op | DotChainItem >> -existential_op | Slice | Index >> -existential_op; |
366 | rule DotChainItem = symx('.') >> Name; | 367 | rule DotChainItem = symx('.') >> Name; |
367 | rule ColonChainItem = symx('\\') >> (LuaKeyword | Name); | 368 | rule ColonChainItem = symx('\\') >> (LuaKeyword | Name); |
368 | rule invoke_chain = Invoke >> -ChainItems; | 369 | rule invoke_chain = Invoke >> -existential_op >> -ChainItems; |
369 | rule ColonChain = ColonChainItem >> -invoke_chain; | 370 | rule ColonChain = ColonChainItem >> -existential_op >> -invoke_chain; |
370 | 371 | ||
371 | rule default_value = true_(); | 372 | rule default_value = true_(); |
372 | rule Slice = | 373 | rule Slice = |