# This file is part of NIT ( http://www.nitlanguage.org ).
#
-# Copyright 2008 Jean Privat <jean@pryen.org>
+# Copyright 2008-2009 Jean Privat <jean@pryen.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# See the License for the specific language governing permissions and
# limitations under the License.
-SABLECC=sablecc3
+SABLECC3ALTGEN ?= sablecc3
all: parser.nit
-# first sed start from first line to line /*I*/ and remove /*.*/
-# second sed clones /*B*/ productions, substitute /*B*/ with no_bra and delete /*N*/ lines
-# third sed from line /*I*/ to last line and remove /*.*/
-nit.sablecc3: nit.sablecc3xx
- @test -f nit.sablecc3 && chmod +w nit.sablecc3 || touch nit.sablecc3
- @echo -n "// This file is autogenerated, no dot modify it" > nit.sablecc3.t
- sed -n -e '1,/\/\*I\*\//{s/\/\*[BIN]\*\///g;p}' nit.sablecc3xx >> nit.sablecc3.t
- sed -n -e '/\/\*B\*\//,/;/{s/\/\*B\*\//_nobra/g;/\/\*N\*\//d;p}' nit.sablecc3xx >> nit.sablecc3.t
- sed -n -e '/\/\*I\*\//,$${s/\/\*[BIN]\*\///g;p}' nit.sablecc3xx >> nit.sablecc3.t
-
- > nit.sablecc3
- sed -n -e '1,/\/\*I2\*\//{s/\/\*[BIN]2\*\///g;p}' nit.sablecc3.t >> nit.sablecc3
- sed -n -e '/\/\*B2\*\//,/;/{s/\/\*B2\*\//_withelse/g;/\/\*N2\*\//d;p}' nit.sablecc3.t >> nit.sablecc3
- sed -n -e '/\/\*I2\*\//,$${s/\/\*[BIN]2\*\///g;p}' nit.sablecc3.t >> nit.sablecc3
-
- cp nit.sablecc3 nit.sablecc3.t
- > nit.sablecc3
- sed -n -e '1,/\/\*I3\*\//{s/\/\*[BIN]3\*\///g;p}' nit.sablecc3.t >> nit.sablecc3
- sed -n -e '/\/\*B3\*\//,/;/{s/\/\*B3\*\//_nopar/g;/\/\*N3\*\//d;p}' nit.sablecc3.t >> nit.sablecc3
- sed -n -e '/\/\*I3\*\//,$${s/\/\*[BIN]3\*\///g;p}' nit.sablecc3.t >> nit.sablecc3
-
- rm nit.sablecc3.t
- @sed -i -e '{s/\/\/#.*//}' nit.sablecc3
- @chmod -w nit.sablecc3
+# Preprocess the extended sablecc gramar
+.nit.sablecc3: nit.sablecc3xx
+ ./prescc.pl $< > $@
-# Note that parser_nodes is automatically synced with the grammar
-parser.nit: nit.sablecc3 xss/*.xss
- cp parser_abs.nit parser_abs.nit.bak || true
- ${SABLECC} -c nit.sablecc3.dump -t xss/main.xss -p usermodule parser_nodes nit.sablecc3
- diff -u parser_abs.nit.bak parser_abs.nit > parser_abs.patch || true
- patch parser_nodes.nit < parser_abs.patch || true
+# Note that parser_nodes is no more automatically synced with the grammar
+parser.nit: .nit.sablecc3 xss/*.xss
+ @${SABLECC3ALTGEN -license} >/dev/null 2>/dev/null || ( echo "***\n*** sablecc3 altgen version is needed.\n*** Set the environment variable SABLECC3ALTGEN to the executable.\n*** Aborting...\n***" ; exit 1 )
+ @${SABLECC3ALTGEN} | grep altgen >/dev/null 2>/dev/null || ( echo "***\n*** $$SABLECC3ALTGEN is not the sablecc3 altgen version.\n*** Set the environment variable SABLECC3ALTGEN to the executable.\n*** Aborting...\n***"; exit 1 )
+ ${SABLECC3ALTGEN} -c .nit.sablecc3.dump -t xss/main.xss -p usermodule parser_nodes .nit.sablecc3
+ mv -f -- parser.nit .parser-nofact.nit
+ ./fact_parser.pl .parser-nofact.nit > parser.nit
+ perl -np -i.orig -e 's/([ (\[])P([A-Z])/\1A\2/g;' -e 's/"{"/"\\{"/g;' parser.nit parser_abs.nit parser_prod.nit lexer.nit
clean:
- rm -f -- nit.sablecc3 nit.sablecc3.dump parser_abs.patch || true
+ rm -f -- .nit.sablecc3 .nit.sablecc3.dump .parser-nofact.nit || true
-dist-clean: clean
- rm -f -- parser.nit parser_abs.nit parser_abs.patch parser_abs.nit.bak parser_prod.nit parser_tables.nit lexer.nit || true
+distclean: clean
+
+maintainer-clean: clean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ rm -f -- parser.nit parser_abs.nit parser_prod.nit lexer.nit || true