1 | // TODO: unary operators |
2 | sclass ShuntingYardCore<Op> {
|
3 | new L<Operator> operatorStack; |
4 | |
5 | void handleEOT() {
|
6 | while (nempty(operatorStack)) {
|
7 | var o = popLast(operatorStack); |
8 | assertNequals(o, "(");
|
9 | outputQueue.add(o); |
10 | } |
11 | } |
12 | |
13 | void handleToken(S token) {
|
14 | if (iTok >= l(tok)) {
|
15 | false; |
16 | } |
17 | |
18 | S t = tok.get(iTok); |
19 | bool op = isOperator(t), space = isSpacer(t); |
20 | if (op && space) warn("Operators should not be spacers");
|
21 | |
22 | if (eq(t, "(")) {
|
23 | finishLiteral(); |
24 | operatorStack.add(t); |
25 | } else if (eq(t, ")")) {
|
26 | finishLiteral(); |
27 | while (!eq(last(operatorStack), "(")) {
|
28 | assertNempty(operatorStack); |
29 | outputQueue.add(popLast(operatorStack)); |
30 | } |
31 | popLast(operatorStack); |
32 | } else if (op) {
|
33 | finishLiteral(); |
34 | S o1 = t, o2; |
35 | while (!eqOneOf(o2 = last(operatorStack), "(", null)
|
36 | && (precedence(o2) > precedence(o1) |
37 | || precedence(o2) == precedence(o1) && isLeftAssociative(o1))) {
|
38 | ifdef ShuntingYardParser_debug |
39 | print("popLast");
|
40 | endifdef |
41 | outputQueue.add(popLast(operatorStack)); |
42 | } |
43 | |
44 | operatorStack.add(o1); |
45 | } |
46 | |
47 | true; |
48 | } |
49 | |
50 | // return 0 for non-operator |
51 | int precedence(Op op) {
|
52 | ret 1; |
53 | } |
54 | |
55 | swappable bool isLeftAssociative(Op op) { true; }
|
56 | } |
Began life as a copy of #1034914
download show line numbers debug dex old transpilations
Travelled to 3 computer(s): bhatertpkbcr, mowyntqkapby, mqqgnosmbjvj
No comments. add comment
| Snippet ID: | #1035189 |
| Snippet name: | ShuntingYardCore - handles operator precences while parsing [abandoned version] |
| Eternal ID of this version: | #1035189/1 |
| Text MD5: | 5f66cde9ccfa658d331f73beda17b664 |
| Author: | stefan |
| Category: | javax |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2022-04-08 17:50:46 |
| Source code size: | 1410 bytes / 56 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 340 / 354 |
| Referenced in: | [show references] |