diff options
-rw-r--r-- | test/yarp/fixtures/arithmetic.txt | 1 | ||||
-rw-r--r-- | test/yarp/snapshots/arithmetic.txt | 100 | ||||
-rw-r--r-- | yarp/yarp.c | 30 |
3 files changed, 93 insertions, 38 deletions
diff --git a/test/yarp/fixtures/arithmetic.txt b/test/yarp/fixtures/arithmetic.txt index 6f86f92d47..47fa4ec24f 100644 --- a/test/yarp/fixtures/arithmetic.txt +++ b/test/yarp/fixtures/arithmetic.txt @@ -6,3 +6,4 @@ foo !bar foo ~bar +foo << bar << baz diff --git a/test/yarp/snapshots/arithmetic.txt b/test/yarp/snapshots/arithmetic.txt index 3a305e4bc3..7138973041 100644 --- a/test/yarp/snapshots/arithmetic.txt +++ b/test/yarp/snapshots/arithmetic.txt @@ -1,8 +1,8 @@ -@ ProgramNode (location: (0...39)) +@ ProgramNode (location: (0...58)) ├── locals: [] └── statements: - @ StatementsNode (location: (0...39)) - └── body: (length: 4) + @ StatementsNode (location: (0...58)) + └── body: (length: 5) ├── @ CallNode (location: (0...8)) │ ├── receiver: ∅ │ ├── call_operator_loc: ∅ @@ -119,35 +119,89 @@ │ ├── block: ∅ │ ├── flags: ∅ │ └── name: "**" - └── @ CallNode (location: (31...39)) - ├── receiver: ∅ + ├── @ CallNode (location: (31...39)) + │ ├── receiver: ∅ + │ ├── call_operator_loc: ∅ + │ ├── message_loc: (31...34) = "foo" + │ ├── opening_loc: ∅ + │ ├── arguments: + │ │ @ ArgumentsNode (location: (35...39)) + │ │ └── arguments: (length: 1) + │ │ └── @ CallNode (location: (35...39)) + │ │ ├── receiver: + │ │ │ @ CallNode (location: (36...39)) + │ │ │ ├── receiver: ∅ + │ │ │ ├── call_operator_loc: ∅ + │ │ │ ├── message_loc: (36...39) = "bar" + │ │ │ ├── opening_loc: ∅ + │ │ │ ├── arguments: ∅ + │ │ │ ├── closing_loc: ∅ + │ │ │ ├── block: ∅ + │ │ │ ├── flags: variable_call + │ │ │ └── name: "bar" + │ │ ├── call_operator_loc: ∅ + │ │ ├── message_loc: (35...36) = "~" + │ │ ├── opening_loc: ∅ + │ │ ├── arguments: ∅ + │ │ ├── closing_loc: ∅ + │ │ ├── block: ∅ + │ │ ├── flags: ∅ + │ │ └── name: "~" + │ ├── closing_loc: ∅ + │ ├── block: ∅ + │ ├── flags: ∅ + │ └── name: "foo" + └── @ CallNode (location: (41...58)) + ├── receiver: + │ @ CallNode (location: (41...51)) + │ ├── receiver: + │ │ @ CallNode (location: (41...44)) + │ │ ├── receiver: ∅ + │ │ ├── call_operator_loc: ∅ + │ │ ├── message_loc: (41...44) = "foo" + │ │ ├── opening_loc: ∅ + │ │ ├── arguments: ∅ + │ │ ├── closing_loc: ∅ + │ │ ├── block: ∅ + │ │ ├── flags: variable_call + │ │ └── name: "foo" + │ ├── call_operator_loc: ∅ + │ ├── message_loc: (45...47) = "<<" + │ ├── opening_loc: ∅ + │ ├── arguments: + │ │ @ ArgumentsNode (location: (48...51)) + │ │ └── arguments: (length: 1) + │ │ └── @ CallNode (location: (48...51)) + │ │ ├── receiver: ∅ + │ │ ├── call_operator_loc: ∅ + │ │ ├── message_loc: (48...51) = "bar" + │ │ ├── opening_loc: ∅ + │ │ ├── arguments: ∅ + │ │ ├── closing_loc: ∅ + │ │ ├── block: ∅ + │ │ ├── flags: variable_call + │ │ └── name: "bar" + │ ├── closing_loc: ∅ + │ ├── block: ∅ + │ ├── flags: ∅ + │ └── name: "<<" ├── call_operator_loc: ∅ - ├── message_loc: (31...34) = "foo" + ├── message_loc: (52...54) = "<<" ├── opening_loc: ∅ ├── arguments: - │ @ ArgumentsNode (location: (35...39)) + │ @ ArgumentsNode (location: (55...58)) │ └── arguments: (length: 1) - │ └── @ CallNode (location: (35...39)) - │ ├── receiver: - │ │ @ CallNode (location: (36...39)) - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── message_loc: (36...39) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ ├── block: ∅ - │ │ ├── flags: variable_call - │ │ └── name: "bar" + │ └── @ CallNode (location: (55...58)) + │ ├── receiver: ∅ │ ├── call_operator_loc: ∅ - │ ├── message_loc: (35...36) = "~" + │ ├── message_loc: (55...58) = "baz" │ ├── opening_loc: ∅ │ ├── arguments: ∅ │ ├── closing_loc: ∅ │ ├── block: ∅ - │ ├── flags: ∅ - │ └── name: "~" + │ ├── flags: variable_call + │ └── name: "baz" ├── closing_loc: ∅ ├── block: ∅ ├── flags: ∅ - └── name: "foo" + └── name: "<<" diff --git a/yarp/yarp.c b/yarp/yarp.c index 78747682cb..f447ea3eda 100644 --- a/yarp/yarp.c +++ b/yarp/yarp.c @@ -7894,29 +7894,29 @@ yp_binding_powers_t yp_binding_powers[YP_TOKEN_MAXIMUM] = { [YP_TOKEN_AMPERSAND_AMPERSAND] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_LOGICAL_AND), // != !~ == === =~ <=> - [YP_TOKEN_BANG_EQUAL] = RIGHT_ASSOCIATIVE(YP_BINDING_POWER_EQUALITY), - [YP_TOKEN_BANG_TILDE] = RIGHT_ASSOCIATIVE(YP_BINDING_POWER_EQUALITY), - [YP_TOKEN_EQUAL_EQUAL] = RIGHT_ASSOCIATIVE(YP_BINDING_POWER_EQUALITY), - [YP_TOKEN_EQUAL_EQUAL_EQUAL] = RIGHT_ASSOCIATIVE(YP_BINDING_POWER_EQUALITY), - [YP_TOKEN_EQUAL_TILDE] = RIGHT_ASSOCIATIVE(YP_BINDING_POWER_EQUALITY), - [YP_TOKEN_LESS_EQUAL_GREATER] = RIGHT_ASSOCIATIVE(YP_BINDING_POWER_EQUALITY), + [YP_TOKEN_BANG_EQUAL] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_EQUALITY), + [YP_TOKEN_BANG_TILDE] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_EQUALITY), + [YP_TOKEN_EQUAL_EQUAL] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_EQUALITY), + [YP_TOKEN_EQUAL_EQUAL_EQUAL] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_EQUALITY), + [YP_TOKEN_EQUAL_TILDE] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_EQUALITY), + [YP_TOKEN_LESS_EQUAL_GREATER] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_EQUALITY), // > >= < <= - [YP_TOKEN_GREATER] = RIGHT_ASSOCIATIVE(YP_BINDING_POWER_COMPARISON), - [YP_TOKEN_GREATER_EQUAL] = RIGHT_ASSOCIATIVE(YP_BINDING_POWER_COMPARISON), - [YP_TOKEN_LESS] = RIGHT_ASSOCIATIVE(YP_BINDING_POWER_COMPARISON), - [YP_TOKEN_LESS_EQUAL] = RIGHT_ASSOCIATIVE(YP_BINDING_POWER_COMPARISON), + [YP_TOKEN_GREATER] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_COMPARISON), + [YP_TOKEN_GREATER_EQUAL] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_COMPARISON), + [YP_TOKEN_LESS] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_COMPARISON), + [YP_TOKEN_LESS_EQUAL] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_COMPARISON), // ^ | - [YP_TOKEN_CARET] = RIGHT_ASSOCIATIVE(YP_BINDING_POWER_BITWISE_OR), - [YP_TOKEN_PIPE] = RIGHT_ASSOCIATIVE(YP_BINDING_POWER_BITWISE_OR), + [YP_TOKEN_CARET] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_BITWISE_OR), + [YP_TOKEN_PIPE] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_BITWISE_OR), // & - [YP_TOKEN_AMPERSAND] = RIGHT_ASSOCIATIVE(YP_BINDING_POWER_BITWISE_AND), + [YP_TOKEN_AMPERSAND] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_BITWISE_AND), // >> << - [YP_TOKEN_GREATER_GREATER] = RIGHT_ASSOCIATIVE(YP_BINDING_POWER_SHIFT), - [YP_TOKEN_LESS_LESS] = RIGHT_ASSOCIATIVE(YP_BINDING_POWER_SHIFT), + [YP_TOKEN_GREATER_GREATER] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_SHIFT), + [YP_TOKEN_LESS_LESS] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_SHIFT), // - + [YP_TOKEN_MINUS] = LEFT_ASSOCIATIVE(YP_BINDING_POWER_TERM), |