bison-patches
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]