[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH for Dlang support 2/4] Renamed the D example to simple and create
From: |
Adela Vais |
Subject: |
[PATCH for Dlang support 2/4] Renamed the D example to simple and created a working base for calc |
Date: |
Tue, 1 Sep 2020 21:54:35 +0300 |
---
examples/d/{ => calc}/Makefile | 0
examples/d/{ => calc}/README.md | 0
examples/d/{ => calc}/calc.test | 0
examples/d/{ => calc}/calc.y | 0
examples/d/{ => calc}/local.mk | 0
examples/d/simple/Makefile | 25 +++++
examples/d/simple/README.md | 28 ++++++
examples/d/simple/calc.test | 26 ++++++
examples/d/simple/calc.y | 156 ++++++++++++++++++++++++++++++++
examples/d/simple/local.mk | 36 ++++++++
10 files changed, 271 insertions(+)
rename examples/d/{ => calc}/Makefile (100%)
rename examples/d/{ => calc}/README.md (100%)
rename examples/d/{ => calc}/calc.test (100%)
rename examples/d/{ => calc}/calc.y (100%)
rename examples/d/{ => calc}/local.mk (100%)
create mode 100644 examples/d/simple/Makefile
create mode 100644 examples/d/simple/README.md
create mode 100644 examples/d/simple/calc.test
create mode 100644 examples/d/simple/calc.y
create mode 100644 examples/d/simple/local.mk
diff --git a/examples/d/Makefile b/examples/d/calc/Makefile
similarity index 100%
rename from examples/d/Makefile
rename to examples/d/calc/Makefile
diff --git a/examples/d/README.md b/examples/d/calc/README.md
similarity index 100%
rename from examples/d/README.md
rename to examples/d/calc/README.md
diff --git a/examples/d/calc.test b/examples/d/calc/calc.test
similarity index 100%
rename from examples/d/calc.test
rename to examples/d/calc/calc.test
diff --git a/examples/d/calc.y b/examples/d/calc/calc.y
similarity index 100%
rename from examples/d/calc.y
rename to examples/d/calc/calc.y
diff --git a/examples/d/local.mk b/examples/d/calc/local.mk
similarity index 100%
rename from examples/d/local.mk
rename to examples/d/calc/local.mk
diff --git a/examples/d/simple/Makefile b/examples/d/simple/Makefile
new file mode 100644
index 00000000..45ae6289
--- /dev/null
+++ b/examples/d/simple/Makefile
@@ -0,0 +1,25 @@
+# This Makefile is designed to be simple and readable. It does not
+# aim at portability. It requires GNU Make.
+
+BISON = bison
+DC = dmd
+XSLTPROC = xsltproc
+
+all: calc
+
+%.d %.xml %.gv: %.y
+ $(BISON) $(BISONFLAGS) --xml --graph=$*.gv -o $*.d $<
+
+%: %.d
+ $(DC) $(DCFLAGS) $<
+
+run: calc
+ @echo "Type arithmetic expressions. Quit with ctrl-d."
+ ./$<
+
+html: calc.html
+%.html: %.xml
+ $(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $$($(BISON)
--print-datadir)/xslt/xml2xhtml.xsl $<
+
+clean:
+ rm -f calc calc.d calc.xml calc.gv calc.html *.o
diff --git a/examples/d/simple/README.md b/examples/d/simple/README.md
new file mode 100644
index 00000000..fe05ef27
--- /dev/null
+++ b/examples/d/simple/README.md
@@ -0,0 +1,28 @@
+# Examples in D
+
+This directory contains examples of Bison grammar files in D.
+
+You can run `make` to compile these examples. And `make clean` to tidy
+afterwards.
+
+## d/calc.y
+The usual calculator.
+
+<!---
+
+Local Variables:
+fill-column: 76
+ispell-dictionary: "american"
+End:
+
+Copyright (C) 2018-2020 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts. A copy of the license is included in the "GNU Free
+Documentation License" file as part of this distribution.
+
+# LocalWords: mfcalc calc parsers yy
+--->
diff --git a/examples/d/simple/calc.test b/examples/d/simple/calc.test
new file mode 100644
index 00000000..cf4f80a8
--- /dev/null
+++ b/examples/d/simple/calc.test
@@ -0,0 +1,26 @@
+#! /bin/sh
+
+# Copyright (C) 2018-2020 Free Software Foundation, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+cat >input <<EOF
+1 + 2 * 3
+EOF
+run 0 7
+
+cat >input <<EOF
+1 + 2 * * 3
+EOF
+run 1 "err: syntax error, unexpected *, expecting + or - or ( or number"
diff --git a/examples/d/simple/calc.y b/examples/d/simple/calc.y
new file mode 100644
index 00000000..15b4f7c7
--- /dev/null
+++ b/examples/d/simple/calc.y
@@ -0,0 +1,156 @@
+/* Parser and scanner for calc in D. -*- D -*-
+
+ Copyright (C) 2018-2020 Free Software Foundation, Inc.
+
+ This file is part of Bison, the GNU Compiler Compiler.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+%language "D"
+
+%define api.parser.class {Calc}
+%define parse.error verbose
+
+%union {
+ int ival;
+}
+
+/* Bison Declarations */
+%token EQ "="
+ PLUS "+"
+ MINUS "-"
+ STAR "*"
+ SLASH "/"
+ LPAR "("
+ RPAR ")"
+ EOL "end of line"
+%token <ival> NUM "number"
+%type <ival> exp
+
+%left "-" "+"
+%left "*" "/"
+%precedence UNARY /* unary operators */
+
+/* Grammar follows */
+%%
+input:
+ line
+| input line
+;
+
+line:
+ EOL
+| exp EOL { writeln ($exp); }
+| error EOL
+;
+
+exp:
+ NUM { $$ = $1; }
+| exp "+" exp { $$ = $1 + $3; }
+| exp "-" exp { $$ = $1 - $3; }
+| exp "*" exp { $$ = $1 * $3; }
+| exp "/" exp { $$ = $1 / $3; }
+| "+" exp %prec UNARY { $$ = $2; }
+| "-" exp %prec UNARY { $$ = -$2; }
+| "(" exp ")" { $$ = $2; }
+;
+
+%%
+import std.range.primitives;
+import std.stdio;
+
+auto calcLexer(R)(R range)
+ if (isInputRange!R && is (ElementType!R : dchar))
+{
+ return new CalcLexer!R(range);
+}
+
+auto calcLexer (File f)
+{
+ import std.algorithm : map, joiner;
+ import std.utf : byDchar;
+
+ return f.byChunk(1024) // avoid making a syscall roundtrip per char
+ .map!(chunk => cast(char[]) chunk) // because byChunk returns ubyte[]
+ .joiner // combine chunks into a single virtual range
of char
+ .calcLexer; // forward to other overload
+}
+
+class CalcLexer(R) : Lexer
+ if (isInputRange!R && is (ElementType!R : dchar))
+{
+ R input;
+
+ this(R r) { input = r; }
+
+ // Should be a local in main, shared with %parse-param.
+ int exit_status = 0;
+
+ public void yyerror (string s)
+ {
+ exit_status = 1;
+ stderr.writeln (s);
+ }
+
+ YYSemanticType semanticVal_;
+
+ public final @property YYSemanticType semanticVal ()
+ {
+ return semanticVal_;
+ }
+
+ int yylex ()
+ {
+ import std.uni : isWhite, isNumber;
+
+ // Skip initial spaces
+ while (!input.empty && input.front != '\n' && isWhite (input.front))
+ input.popFront;
+
+ if (input.empty)
+ return TokenKind.YYEOF;
+
+ // Numbers.
+ if (input.front.isNumber)
+ {
+ import std.conv : parse;
+ semanticVal_.ival = input.parse!int;
+ return TokenKind.NUM;
+ }
+
+ // Individual characters
+ auto ch = input.front;
+ input.popFront;
+ switch (ch)
+ {
+ case '=': return TokenKind.EQ;
+ case '+': return TokenKind.PLUS;
+ case '-': return TokenKind.MINUS;
+ case '*': return TokenKind.STAR;
+ case '/': return TokenKind.SLASH;
+ case '(': return TokenKind.LPAR;
+ case ')': return TokenKind.RPAR;
+ case '\n': return TokenKind.EOL;
+ default: assert(0);
+ }
+ }
+}
+
+int main ()
+{
+ auto l = calcLexer (stdin);
+ auto p = new Calc (l);
+ p.parse ();
+ return l.exit_status;
+}
diff --git a/examples/d/simple/local.mk b/examples/d/simple/local.mk
new file mode 100644
index 00000000..40f8f63a
--- /dev/null
+++ b/examples/d/simple/local.mk
@@ -0,0 +1,36 @@
+## Copyright (C) 2018-2020 Free Software Foundation, Inc.
+##
+## This program is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ddir = $(docdir)/%D%
+
+## ------ ##
+## Calc. ##
+## ------ ##
+
+if ENABLE_D
+ check_SCRIPTS += %D%/calc
+ TESTS += %D%/calc.test
+endif
+EXTRA_DIST += %D%/calc.test
+
+%D%/calc.d: %D%/calc.y $(dependencies)
+ $(AM_V_GEN)$(MKDIR_P) %D%
+ $(AM_V_at)$(BISON) $(srcdir)/%D%/calc.y -o $@
+
+%D%/calc: %D%/calc.d
+ $(AM_V_GEN) $(DC) $(DCFLAGS) -of$@ %D%/calc.d
+
+dist_d_DATA = %D%/calc.y %D%/Makefile %D%/README.md
+CLEANFILES += %D%/calc %D%/calc.[do]
--
2.17.1