summaryrefslogtreecommitdiff
path: root/chapter03/docs/03-grammar.md
diff options
context:
space:
mode:
authorDibyendu Majumdar <dibyendumajumdar@users.noreply.github.com>2023-10-01 18:01:54 +0100
committerGitHub <noreply@github.com>2023-10-01 10:01:54 -0700
commitdf5294e88cc409d7adf3e10666bfcb40e34472b9 (patch)
treea890d2a65704870a27211613b81f1e950f73a588 /chapter03/docs/03-grammar.md
parent3f2e9e84e137462272ae1bb592f47cecc362bdff (diff)
downloadSimple-df5294e88cc409d7adf3e10666bfcb40e34472b9.tar.gz
Simple-df5294e88cc409d7adf3e10666bfcb40e34472b9.zip
Chapter 3 - add vars and lexical scope. (#7)
* Chapter 3 - add vars and lexical scope. * Fix typo * Overhaul graph viz Makes the scopes pointing into the graph being build more visually appealing. Constants are a printed with just the constant value. * Fix control edge color * Fix missing grouping operator parse Add a parens test. Shorten names 'Identifier' to 'Id' _lexer.match -> match require() passes a Node thru, so can be flow-coded. Uniform syntax error messages. Handy Lexer.toString for debugging. Drop Optional for null returns; less total code; less objects; less confusion. camelCase some fcns. * All parser helpers return Node, not void. Drop _ret. parseBlock and parseStatement now the same. * CLosely align chap2 and chap3 parsers Mostly whitespace aligned; dragged a few functions around to make more sense. I think the diff from Ch2 and Ch3 is down a few differences about what is a statement, plus all the symbol stuff for scopes and variables. * Add examples illustrating the symbol table creation. * Update docs and comments --------- Co-authored-by: Cliff Click <cliffc@acm.org>
Diffstat (limited to 'chapter03/docs/03-grammar.md')
-rw-r--r--chapter03/docs/03-grammar.md72
1 files changed, 72 insertions, 0 deletions
diff --git a/chapter03/docs/03-grammar.md b/chapter03/docs/03-grammar.md
new file mode 100644
index 00000000..2a6d4c1b
--- /dev/null
+++ b/chapter03/docs/03-grammar.md
@@ -0,0 +1,72 @@
+# Grammar for Chapter 1
+
+```antlrv4
+grammar SimpleLanguage;
+
+program
+ : statement+ EOF
+ ;
+
+statement
+ : returnStatement
+ | declStatement
+ | blockStatment
+ | expressionStatement
+ | metaStatement
+ ;
+
+metaStatement
+ : '#showGraph' ';'
+ ;
+
+expressionStatement
+ : IDENTIFIER '=' expression ';'
+ ;
+
+blockStatement
+ : '{' statement+ '}'
+ ;
+
+declStatement
+ : 'int' IDENTIFIER '=' expression ';'
+ ;
+
+returnStatement
+ : 'return' expression ';'
+ ;
+
+expression
+ : additiveExpression
+ ;
+
+additiveExpression
+ : multiplicativeExpression (('+' | '-') multiplicativeExpression)*
+ ;
+
+multiplicativeExpression
+ : unaryExpression (('*' | '/') unaryExpression)*
+ ;
+
+unaryExpression
+ : ('-') unaryExpression
+ | primaryExpression
+ ;
+
+primaryExpression
+ : IDENTIFIER
+ | INTEGER_LITERAL
+ | '(' expression ')'
+ ;
+
+INTEGER_LITERAL
+ : [1-9][0-9]*
+ | [0]
+ ;
+
+IDENTIFIER
+ : NON_DIGIT (NON_DIGIT | DIGIT)*
+ ;
+
+NON_DIGIT: [a-zA-Z_];
+DEC_DIGIT: [0-9];
+``` \ No newline at end of file