summaryrefslogtreecommitdiff
path: root/base/lang-process.md
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2017-10-25 12:10:14 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2017-10-25 12:10:14 -0300
commit7bda9de511a5642efb297eae98c6ea7c42b27754 (patch)
treedff1aa772b9ac088c5bd07b8d10d944cbff89f96 /base/lang-process.md
parentf028ea6dc555fc5192a96b00b8e96e90dbf6de55 (diff)
Start switch to maven modules
Diffstat (limited to 'base/lang-process.md')
-rw-r--r--base/lang-process.md65
1 files changed, 65 insertions, 0 deletions
diff --git a/base/lang-process.md b/base/lang-process.md
new file mode 100644
index 0000000..1175fca
--- /dev/null
+++ b/base/lang-process.md
@@ -0,0 +1,65 @@
+# Top level reader loop
+First, a command is read in from the user under a prompt
+
+Next, it is checked if the first token of the command (split on " ")
+corresponds to an action name
+* If it does, the corresponding action is executed, and the next command is
+ read
+* If it doesn't, the command is parsed as a language command and executed
+
+This continues until the command "quit" (non case-sensitive) is read
+
+# Known actions
+The currently implemented actions are:
+* env: print out the contents of the enviroment. Takes no arguments
+* inline: inline variables out of the definition of specified variables. Takes
+ at least two arguments
+ * The first is the name of the variable to do inlining in
+ * The second is the name of the variable to bind the inlined expression to
+ * The third and following are the names of the variables to inline in the
+ variable you are inlining. If you don't give any, it will inline every
+ variable
+
+## Details on inlining
+The way the inlining process works is simple. The tree for the variable to be
+inlined is read, and then each variable reference is inlined if it is marked as
+one of the variable references to inline. This only occurs one layer deep
+
+# Parsing language commands
+Once it is decided to parse a command as a language command, it goes through
+four steps:
+* Preparation
+* AST Building
+* AST Transformation
+* AST Evaluation
+
+# Command preparation
+Command preparation means turning the raw space-seperated tokens into tokens
+suitable for feeding the AST builder. It involves the following steps:
+* The first is operator expansion, which turns a token like 4+4 into the three
+ tokens 4, +, and 4
+* The next is token deaffixation which turns a token like (4 into the tokens (
+ and 4. However, ((4 will become (( 4, not ( ( 4, because (( is a different
+ nesting level than (
+* Next, any blank tokens that have been created as a result of the process are
+ disposed of
+* Finally, the entire expression is shunted, turning it from infix notation to
+ postfix notation. The only real special thing about this is that (( is a
+ different nesting level than (. The token precedence levels are (sorted from
+ lower to higher precedence):
+ * Math precedence
+ * + & -
+ * * & /
+ *
+ * Dice precedence
+ * d
+ * c
+ * Expression precedence
+ * =>
+ * :=
+
+# AST Building
+AST building is a slightly more complex process, as the tree is traversed
+twice: once to build the tree, and then again to convert the tokens from
+strings into data tokens. The only really finicky part about the first tree is
+arrays, because arrays are still in infix form at this point.