aboutsummaryrefslogtreecommitdiff
path: root/lib/qparser/explain.sh
diff options
context:
space:
mode:
Diffstat (limited to 'lib/qparser/explain.sh')
-rwxr-xr-xlib/qparser/explain.sh5
1 files changed, 5 insertions, 0 deletions
diff --git a/lib/qparser/explain.sh b/lib/qparser/explain.sh
new file mode 100755
index 0000000..609d208
--- /dev/null
+++ b/lib/qparser/explain.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+menhir --explain tokens.mly qsp_expression.mly --base qsp_expression.mly
+menhir --explain tokens.mly qsp_expression.mly qsp_instruction.mly --base qsp_instruction.mly
+menhir --explain tokens.mly qsp_expression.mly qsp_instruction.mly parser.mly --base parser.mly
r: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
# Reading QSP

The QSP language was not designed to be processed in this way. There are
ambivalent cases that cannot be represented cleanly via a grammar.

An example is the `!` character, which can indicate the start of a comment, or
an inequality operator.

Another example is the `*` character, which can be the first character of an
instruction, or a multiplication operation. For example:

- `*clr()` is a valid instruction, but `5 *clr()` is not.
- `*rnd()` is an invalid instruction, but `5 *rnd()` is valid.
(As a bonus `rnd* rnd()` is also valid…)

What's more, the language is very permissive, allowing for structures that are
actually incorrect.

For example:

```
if $PARGS[0] = 'Day1':
end

elseif $ARGS[0] = 'Week1':
end
```

As a result, the application may pick up errors on particular cases that are
nonetheless valid. I've tried to respect the syntax of the QSP language as much
as possible, but on borderline cases, I consider that being stricter is
positive.