OSDN Git Service

object表現であったobject.cppを削除し、datum.cppとして再定義した。
authorderui <derutakayu@user.sourceforge.jp>
Sat, 20 Feb 2010 00:05:19 +0000 (09:05 +0900)
committerderui <derutakayu@user.sourceforge.jp>
Sat, 20 Feb 2010 00:05:19 +0000 (09:05 +0900)
datumをlexemeから解釈するためのdatum_parserを定義した。
各datumの定義を行った。

17 files changed:
.gitignore
Makefile
Rakefile
config.log
config.status
src/lexer/scheme_lexer.h
src/lexer/token.h
src/object.cpp [deleted file]
src/parser/datum.cpp
src/parser/datum.h
src/parser/datum_base.cpp
src/parser/datum_base.h
src/parser/datum_parser.cpp [new file with mode: 0755]
src/parser/datum_parser.h [new file with mode: 0755]
test/environment_test.cpp.bk [moved from test/environment_test.cpp with 100% similarity]
test/number_lexer_test.cpp
test/parser_test.cpp

index dae671f..fdb780a 100644 (file)
@@ -77,3 +77,4 @@ utakata
 /test/.deps/utf8_transcoder_test.po
 /test/Rakefile
 /test/charactor_lexer_test
+*.mf
\ No newline at end of file
index b102303..e52a6a9 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -69,11 +69,11 @@ DIST_ARCHIVES = $(distdir).tar.gz
 GZIP_ENV = --best
 distuninstallcheck_listfiles = find . -type f -print
 distcleancheck_listfiles = find . -type f -print
-ACLOCAL = ${SHELL} /home/derui/develop/utakata/missing --run aclocal-1.10
-AMTAR = ${SHELL} /home/derui/develop/utakata/missing --run tar
-AUTOCONF = ${SHELL} /home/derui/develop/utakata/missing --run autoconf
-AUTOHEADER = ${SHELL} /home/derui/develop/utakata/missing --run autoheader
-AUTOMAKE = ${SHELL} /home/derui/develop/utakata/missing --run automake-1.10
+ACLOCAL = ${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run aclocal-1.10
+AMTAR = ${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run tar
+AUTOCONF = ${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run autoconf
+AUTOHEADER = ${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run autoheader
+AUTOMAKE = ${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run automake-1.10
 AWK = gawk
 CC = gcc
 CCDEPMODE = depmode=gcc3
@@ -83,16 +83,16 @@ CPPFLAGS =
 CXX = g++
 CXXDEPMODE = depmode=gcc3
 CXXFLAGS = -g -O2
-CYGPATH_W = echo
+CYGPATH_W = cygpath -w
 DEFS = -DHAVE_CONFIG_H
 DEPDIR = .deps
 ECHO_C = 
 ECHO_N = -n
 ECHO_T = 
 EGREP = /bin/grep -E
-EXEEXT = 
+EXEEXT = .exe
 GREP = /bin/grep
-INSTALL = /usr/bin/install -c
+INSTALL = /bin/install -c
 INSTALL_DATA = ${INSTALL} -m 644
 INSTALL_PROGRAM = ${INSTALL}
 INSTALL_SCRIPT = ${INSTALL}
@@ -101,7 +101,7 @@ LDFLAGS =
 LIBOBJS = 
 LIBS = 
 LTLIBOBJS = 
-MAKEINFO = ${SHELL} /home/derui/develop/utakata/missing --run makeinfo
+MAKEINFO = ${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run makeinfo
 MKDIR_P = /bin/mkdir -p
 OBJEXT = o
 PACKAGE = utakata
@@ -115,10 +115,10 @@ SET_MAKE =
 SHELL = /bin/sh
 STRIP = 
 VERSION = 0.0.1
-abs_builddir = /home/derui/develop/utakata
-abs_srcdir = /home/derui/develop/utakata
-abs_top_builddir = /home/derui/develop/utakata
-abs_top_srcdir = /home/derui/develop/utakata
+abs_builddir = /cygdrive/c/meadow/develop/utakata
+abs_srcdir = /cygdrive/c/meadow/develop/utakata
+abs_top_builddir = /cygdrive/c/meadow/develop/utakata
+abs_top_srcdir = /cygdrive/c/meadow/develop/utakata
 ac_ct_CC = gcc
 ac_ct_CXX = g++
 am__include = include
@@ -138,7 +138,7 @@ host_alias =
 htmldir = ${docdir}
 includedir = ${prefix}/include
 infodir = ${datarootdir}/info
-install_sh = $(SHELL) /home/derui/develop/utakata/install-sh
+install_sh = $(SHELL) /cygdrive/c/meadow/develop/utakata/install-sh
 libdir = ${exec_prefix}/lib
 libexecdir = ${exec_prefix}/libexec
 localedir = ${datarootdir}/locale
index e403d94..f0f7384 100644 (file)
--- a/Rakefile
+++ b/Rakefile
@@ -23,9 +23,9 @@ TEST_SRCS = FileList[File.join(TOP_DIR, "test/*.cpp")]
 TEST_OBJECTS = TEST_SRCS.ext("o")
 TEST_OBJECTS.include(OBJS)
 TEST_DEPS = TEST_SRCS.ext("mf")
-TEST_PROGRAMS = TEST_SRCS.ext("")
+TEST_PROGRAMS = TEST_SRCS.ext(".exe")
 
-EXEEXT = ""
+EXEEXT = ".exe"
 
 # lists of clean objects
 CLEAN.include(OBJS, TEST_OBJECTS, DEPS)
index 76ef1ab..e885965 100644 (file)
@@ -10,16 +10,16 @@ generated by GNU Autoconf 2.63.  Invocation command line was
 ## Platform. ##
 ## --------- ##
 
-hostname = vaio_z
+hostname = c2007
 uname -m = i686
-uname -r = 2.6.32-gentoo-r1
-uname -s = Linux
-uname -v = #3 SMP Sat Jan 23 12:42:49 JST 2010
+uname -r = 1.7.1(0.218/5/3)
+uname -s = CYGWIN_NT-5.0
+uname -v = 2009-12-07 11:48
 
-/usr/bin/uname -p = Intel(R) Core(TM)2 Duo CPU P8800 @ 2.66GHz
+/usr/bin/uname -p = unknown
 /bin/uname -X     = unknown
 
-/bin/arch              = unknown
+/bin/arch              = i686
 /usr/bin/arch -k       = unknown
 /usr/convex/getsysinfo = unknown
 /usr/bin/hostinfo      = unknown
@@ -27,7 +27,9 @@ uname -v = #3 SMP Sat Jan 23 12:42:49 JST 2010
 /usr/bin/oslevel       = unknown
 /bin/universe          = unknown
 
+PATH: /cygdrive/d/Program Files/OMake/bin
 PATH: /home/derui/bin
+PATH: /usr/local/stow/bin
 PATH: /usr/local/bin
 PATH: /usr/local/sbin
 PATH: /usr/sbin
@@ -44,7 +46,7 @@ PATH: /usr/X11R6/bin
 ## ----------- ##
 
 configure:1883: checking for a BSD-compatible install
-configure:1951: result: /usr/bin/install -c
+configure:1951: result: /bin/install -c
 configure:1962: checking whether build environment is sane
 configure:2005: result: yes
 configure:2030: checking for a thread-safe mkdir -p
@@ -55,11 +57,11 @@ configure:2109: result: gawk
 configure:2120: checking whether make sets $(MAKE)
 configure:2142: result: yes
 configure:2386: checking for g++
-configure:2402: found /usr/bin/g++
+configure:2402: found /bin/g++
 configure:2413: result: g++
 configure:2440: checking for C++ compiler version
 configure:2448: g++ --version >&5
-g++ (Gentoo 4.3.4 p1.0, pie-10.1.5) 4.3.4
+g++ (GCC) 4.3.4 20090804 (release) 1
 Copyright (C) 2008 Free Software Foundation, Inc.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
@@ -67,10 +69,10 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 configure:2452: $? = 0
 configure:2459: g++ -v >&5
 Using built-in specs.
-Target: i686-pc-linux-gnu
-Configured with: /var/tmp/portage/sys-devel/gcc-4.3.4/work/gcc-4.3.4/configure --prefix=/usr --bindir=/usr/i686-pc-linux-gnu/gcc-bin/4.3.4 --includedir=/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include --datadir=/usr/share/gcc-data/i686-pc-linux-gnu/4.3.4 --mandir=/usr/share/gcc-data/i686-pc-linux-gnu/4.3.4/man --infodir=/usr/share/gcc-data/i686-pc-linux-gnu/4.3.4/info --with-gxx-include-dir=/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4 --host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --disable-altivec --disable-fixed-point --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --enable-secureplt --disable-multilib --enable-libmudflap --disable-libssp --enable-libgomp --disable-libgcj --with-arch=i686 --enable-languages=c,c++,treelang,fortran --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --with-bugurl=http://bugs.gentoo.org/ --with-pkgversion='Gentoo 4.3.4 p1.0, pie-10.1.5'
+Target: i686-pc-cygwin
+Configured with: /gnu/gcc/releases/packaging/4.3.4-3/gcc4-4.3.4-3/src/gcc-4.3.4/configure --srcdir=/gnu/gcc/releases/packaging/4.3.4-3/gcc4-4.3.4-3/src/gcc-4.3.4 --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/lib --datadir=/usr/share --localstatedir=/var --sysconfdir=/etc --infodir=/usr/share/info --mandir=/usr/share/man --datadir=/usr/share --infodir=/usr/share/info --mandir=/usr/share/man -v --with-gmp=/usr --with-mpfr=/usr --enable-bootstrap --enable-version-specific-runtime-libs --with-slibdir=/usr/bin --libexecdir=/usr/lib --enable-static --enable-shared --enable-shared-libgcc --disable-__cxa_atexit --with-gnu-ld --with-gnu-as --with-dwarf2 --disable-sjlj-exceptions --enable-languages=ada,c,c++,fortran,java,objc,obj-c++ --disable-symvers --enable-libjava --program-suffix=-4 --enable-libgomp --enable-libssp --enable-libada --enable-threads=posix --with-arch=i686 --with-tune=generic --enable-libgcj-sublibs CC=gcc-4 CXX=g++-4 CC_FOR_TARGET=gcc-4 CXX_FOR_TARGET=g++-4 GNATMAKE_FOR_TARGET=gnatmake GNATBIND_FOR_TARGET=gnatbind AS=/opt/gcc-tools/bin/as.exe AS_FOR_TARGET=/opt/gcc-tools/bin/as.exe LD=/opt/gcc-tools/bin/ld.exe LD_FOR_TARGET=/opt/gcc-tools/bin/ld.exe --with-ecj-jar=/usr/share/java/ecj.jar
 Thread model: posix
-gcc version 4.3.4 (Gentoo 4.3.4 p1.0, pie-10.1.5
+gcc version 4.3.4 20090804 (release) 1 (GCC
 configure:2463: $? = 0
 configure:2470: g++ -V >&5
 g++: '-V' option must have argument
@@ -78,17 +80,17 @@ configure:2474: $? = 1
 configure:2497: checking for C++ compiler default output file name
 configure:2519: g++    conftest.cpp  >&5
 configure:2523: $? = 0
-configure:2561: result: a.out
+configure:2561: result: a.exe
 configure:2580: checking whether the C++ compiler works
-configure:2590: ./a.out
+configure:2590: ./a.exe
 configure:2594: $? = 0
 configure:2613: result: yes
 configure:2620: checking whether we are cross compiling
 configure:2622: result: no
 configure:2625: checking for suffix of executables
-configure:2632: g++ -o conftest    conftest.cpp  >&5
+configure:2632: g++ -o conftest.exe    conftest.cpp  >&5
 configure:2636: $? = 0
-configure:2662: result: 
+configure:2662: result: .exe
 configure:2668: checking for suffix of object files
 configure:2694: g++ -c   conftest.cpp >&5
 configure:2698: $? = 0
@@ -106,11 +108,11 @@ configure:2989: result: GNU
 configure:3014: checking dependency style of g++
 configure:3105: result: gcc3
 configure:3168: checking for gcc
-configure:3184: found /usr/bin/gcc
+configure:3184: found /bin/gcc
 configure:3195: result: gcc
 configure:3427: checking for C compiler version
 configure:3435: gcc --version >&5
-gcc (Gentoo 4.3.4 p1.0, pie-10.1.5) 4.3.4
+gcc (GCC) 4.3.4 20090804 (release) 1
 Copyright (C) 2008 Free Software Foundation, Inc.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
@@ -118,10 +120,10 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 configure:3439: $? = 0
 configure:3446: gcc -v >&5
 Using built-in specs.
-Target: i686-pc-linux-gnu
-Configured with: /var/tmp/portage/sys-devel/gcc-4.3.4/work/gcc-4.3.4/configure --prefix=/usr --bindir=/usr/i686-pc-linux-gnu/gcc-bin/4.3.4 --includedir=/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include --datadir=/usr/share/gcc-data/i686-pc-linux-gnu/4.3.4 --mandir=/usr/share/gcc-data/i686-pc-linux-gnu/4.3.4/man --infodir=/usr/share/gcc-data/i686-pc-linux-gnu/4.3.4/info --with-gxx-include-dir=/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4 --host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --disable-altivec --disable-fixed-point --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --enable-secureplt --disable-multilib --enable-libmudflap --disable-libssp --enable-libgomp --disable-libgcj --with-arch=i686 --enable-languages=c,c++,treelang,fortran --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --with-bugurl=http://bugs.gentoo.org/ --with-pkgversion='Gentoo 4.3.4 p1.0, pie-10.1.5'
+Target: i686-pc-cygwin
+Configured with: /gnu/gcc/releases/packaging/4.3.4-3/gcc4-4.3.4-3/src/gcc-4.3.4/configure --srcdir=/gnu/gcc/releases/packaging/4.3.4-3/gcc4-4.3.4-3/src/gcc-4.3.4 --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/lib --datadir=/usr/share --localstatedir=/var --sysconfdir=/etc --infodir=/usr/share/info --mandir=/usr/share/man --datadir=/usr/share --infodir=/usr/share/info --mandir=/usr/share/man -v --with-gmp=/usr --with-mpfr=/usr --enable-bootstrap --enable-version-specific-runtime-libs --with-slibdir=/usr/bin --libexecdir=/usr/lib --enable-static --enable-shared --enable-shared-libgcc --disable-__cxa_atexit --with-gnu-ld --with-gnu-as --with-dwarf2 --disable-sjlj-exceptions --enable-languages=ada,c,c++,fortran,java,objc,obj-c++ --disable-symvers --enable-libjava --program-suffix=-4 --enable-libgomp --enable-libssp --enable-libada --enable-threads=posix --with-arch=i686 --with-tune=generic --enable-libgcj-sublibs CC=gcc-4 CXX=g++-4 CC_FOR_TARGET=gcc-4 CXX_FOR_TARGET=g++-4 GNATMAKE_FOR_TARGET=gnatmake GNATBIND_FOR_TARGET=gnatbind AS=/opt/gcc-tools/bin/as.exe AS_FOR_TARGET=/opt/gcc-tools/bin/as.exe LD=/opt/gcc-tools/bin/ld.exe LD_FOR_TARGET=/opt/gcc-tools/bin/ld.exe --with-ecj-jar=/usr/share/java/ecj.jar
 Thread model: posix
-gcc version 4.3.4 (Gentoo 4.3.4 p1.0, pie-10.1.5
+gcc version 4.3.4 20090804 (release) 1 (GCC
 configure:3450: $? = 0
 configure:3457: gcc -V >&5
 gcc: '-V' option must have argument
@@ -181,9 +183,9 @@ configure:4285: result: /bin/grep -E
 configure:4290: checking for ANSI C header files
 configure:4320: gcc -c -g -O2  conftest.c >&5
 configure:4327: $? = 0
-configure:4426: gcc -o conftest -g -O2   conftest.c  >&5
+configure:4426: gcc -o conftest.exe -g -O2   conftest.c  >&5
 configure:4430: $? = 0
-configure:4436: ./conftest
+configure:4436: ./conftest.exe
 configure:4440: $? = 0
 configure:4458: result: yes
 configure:4482: checking for sys/types.h
@@ -230,8 +232,8 @@ configure:4660: checking for _Bool
 configure:4688: gcc -c -g -O2  conftest.c >&5
 configure:4695: $? = 0
 configure:4722: gcc -c -g -O2  conftest.c >&5
-conftest.c: In function 'main':
-conftest.c:56: error: expected expression before ')' token
+conftest.c: In function ‘main’:
+conftest.c:56: error: expected expression before ‘)’ token
 configure:4729: $? = 1
 configure: failed program was:
 | /* confdefs.h.  */
@@ -303,8 +305,8 @@ configure:4841: checking for size_t
 configure:4869: gcc -c -g -O2  conftest.c >&5
 configure:4876: $? = 0
 configure:4903: gcc -c -g -O2  conftest.c >&5
-conftest.c: In function 'main':
-conftest.c:58: error: expected expression before ')' token
+conftest.c: In function ‘main’:
+conftest.c:58: error: expected expression before ‘)’ token
 configure:4910: $? = 1
 configure: failed program was:
 | /* confdefs.h.  */
@@ -385,7 +387,7 @@ generated by GNU Autoconf 2.63.  Invocation command line was
   CONFIG_COMMANDS = 
   $ ./config.status 
 
-on vaio_z
+on c2007
 
 config.status:778: creating Makefile
 config.status:778: creating Rakefile
@@ -424,6 +426,7 @@ ac_cv_env_host_alias_set=
 ac_cv_env_host_alias_value=
 ac_cv_env_target_alias_set=
 ac_cv_env_target_alias_value=
+ac_cv_exeext=.exe
 ac_cv_header_inttypes_h=yes
 ac_cv_header_memory_h=yes
 ac_cv_header_stdbool_h=yes
@@ -438,7 +441,7 @@ ac_cv_header_unistd_h=yes
 ac_cv_objext=o
 ac_cv_path_EGREP='/bin/grep -E'
 ac_cv_path_GREP=/bin/grep
-ac_cv_path_install='/usr/bin/install -c'
+ac_cv_path_install='/bin/install -c'
 ac_cv_path_mkdir=/bin/mkdir
 ac_cv_prog_AWK=gawk
 ac_cv_prog_CPP='gcc -E'
@@ -457,14 +460,14 @@ am_cv_CXX_dependencies_compiler_type=gcc3
 ## Output variables. ##
 ## ----------------- ##
 
-ACLOCAL='${SHELL} /home/derui/develop/utakata/missing --run aclocal-1.10'
+ACLOCAL='${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run aclocal-1.10'
 AMDEPBACKSLASH='\'
 AMDEP_FALSE='#'
 AMDEP_TRUE=''
-AMTAR='${SHELL} /home/derui/develop/utakata/missing --run tar'
-AUTOCONF='${SHELL} /home/derui/develop/utakata/missing --run autoconf'
-AUTOHEADER='${SHELL} /home/derui/develop/utakata/missing --run autoheader'
-AUTOMAKE='${SHELL} /home/derui/develop/utakata/missing --run automake-1.10'
+AMTAR='${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run tar'
+AUTOCONF='${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run autoconf'
+AUTOHEADER='${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run autoheader'
+AUTOMAKE='${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run automake-1.10'
 AWK='gawk'
 CC='gcc'
 CCDEPMODE='depmode=gcc3'
@@ -474,14 +477,14 @@ CPPFLAGS=''
 CXX='g++'
 CXXDEPMODE='depmode=gcc3'
 CXXFLAGS='-g -O2'
-CYGPATH_W='echo'
+CYGPATH_W='cygpath -w'
 DEFS='-DHAVE_CONFIG_H'
 DEPDIR='.deps'
 ECHO_C=''
 ECHO_N='-n'
 ECHO_T=''
 EGREP='/bin/grep -E'
-EXEEXT=''
+EXEEXT='.exe'
 GREP='/bin/grep'
 INSTALL_DATA='${INSTALL} -m 644'
 INSTALL_PROGRAM='${INSTALL}'
@@ -491,7 +494,7 @@ LDFLAGS=''
 LIBOBJS=''
 LIBS=''
 LTLIBOBJS=''
-MAKEINFO='${SHELL} /home/derui/develop/utakata/missing --run makeinfo'
+MAKEINFO='${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run makeinfo'
 MKDIR_P='/bin/mkdir -p'
 OBJEXT='o'
 PACKAGE='utakata'
@@ -528,7 +531,7 @@ host_alias=''
 htmldir='${docdir}'
 includedir='${prefix}/include'
 infodir='${datarootdir}/info'
-install_sh='$(SHELL) /home/derui/develop/utakata/install-sh'
+install_sh='$(SHELL) /cygdrive/c/meadow/develop/utakata/install-sh'
 libdir='${exec_prefix}/lib'
 libexecdir='${exec_prefix}/libexec'
 localedir='${datarootdir}/locale'
index e1726bb..4bbfd37 100755 (executable)
@@ -363,9 +363,9 @@ Copyright (C) 2008 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
 
-ac_pwd='/home/derui/develop/utakata'
+ac_pwd='/cygdrive/c/meadow/develop/utakata'
 srcdir='.'
-INSTALL='/usr/bin/install -c'
+INSTALL='/bin/install -c'
 MKDIR_P='/bin/mkdir -p'
 AWK='gawk'
 test -n "$AWK" || AWK=awk
@@ -554,7 +554,7 @@ S["am__quote"]=""
 S["am__include"]="include"
 S["DEPDIR"]=".deps"
 S["OBJEXT"]="o"
-S["EXEEXT"]=""
+S["EXEEXT"]=".exe"
 S["ac_ct_CXX"]="g++"
 S["CPPFLAGS"]=""
 S["LDFLAGS"]=""
@@ -562,7 +562,7 @@ S["CXXFLAGS"]="-g -O2"
 S["CXX"]="g++"
 S["am__untar"]="${AMTAR} xf -"
 S["am__tar"]="${AMTAR} chof - \"$$tardir\""
-S["AMTAR"]="${SHELL} /home/derui/develop/utakata/missing --run tar"
+S["AMTAR"]="${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run tar"
 S["am__leading_dot"]="."
 S["SET_MAKE"]=""
 S["AWK"]="gawk"
@@ -570,15 +570,15 @@ S["mkdir_p"]="/bin/mkdir -p"
 S["MKDIR_P"]="/bin/mkdir -p"
 S["INSTALL_STRIP_PROGRAM"]="$(install_sh) -c -s"
 S["STRIP"]=""
-S["install_sh"]="$(SHELL) /home/derui/develop/utakata/install-sh"
-S["MAKEINFO"]="${SHELL} /home/derui/develop/utakata/missing --run makeinfo"
-S["AUTOHEADER"]="${SHELL} /home/derui/develop/utakata/missing --run autoheader"
-S["AUTOMAKE"]="${SHELL} /home/derui/develop/utakata/missing --run automake-1.10"
-S["AUTOCONF"]="${SHELL} /home/derui/develop/utakata/missing --run autoconf"
-S["ACLOCAL"]="${SHELL} /home/derui/develop/utakata/missing --run aclocal-1.10"
+S["install_sh"]="$(SHELL) /cygdrive/c/meadow/develop/utakata/install-sh"
+S["MAKEINFO"]="${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run makeinfo"
+S["AUTOHEADER"]="${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run autoheader"
+S["AUTOMAKE"]="${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run automake-1.10"
+S["AUTOCONF"]="${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run autoconf"
+S["ACLOCAL"]="${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run aclocal-1.10"
 S["VERSION"]="0.0.1"
 S["PACKAGE"]="utakata"
-S["CYGPATH_W"]="echo"
+S["CYGPATH_W"]="cygpath -w"
 S["am__isrc"]=""
 S["INSTALL_DATA"]="${INSTALL} -m 644"
 S["INSTALL_SCRIPT"]="${INSTALL}"
index f5d3490..96db774 100644 (file)
@@ -9,6 +9,7 @@
 #define _UTAKATA_SRC_LEXER_SCHEME_LEXER_H_
 
 #include <vector>
+#include "src/lexer/lexer_interface.h"
 #include "lib/smart_ptr.h"
 
 namespace utakata {
@@ -55,7 +56,7 @@ public:
 };
 } // end of namespace detail
 
-class SchemeLexer {
+class SchemeLexer : public IPartOfLexer {
   // Scheme構文のうち、指定された条件に該当するような構文に該当する文字列
   // が読出されているかどうかをチェックする機能のみを切り出した
   // 限定Lexerです。
@@ -86,6 +87,12 @@ class SchemeLexer {
   std::vector<akebono::smart_ptr<lexer::IPartOfLexer> > inner_lexers_;
 };
 
+// SchemeLexerの生成を行います。処理自体は単純です。
+class SchemeLexerCreator : public ILexerCreator {
+ public:
+  virtual IPartOfLexer* Create() const {return new SchemeLexer();}
+};
+
 }
 }
 
index 916191c..e430e4c 100644 (file)
@@ -5,8 +5,6 @@
 #ifndef _UTAKATA_SRC_LEXER_TOKEN_H_
 #define _UTAKATA_SRC_LEXER_TOKEN_H_
 
-
-
 #include "lib/smart_ptr.h"
 
 namespace utakata {
diff --git a/src/object.cpp b/src/object.cpp
deleted file mode 100644 (file)
index 000c444..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-#include "src/exception_macro.h"
-#include "src/exception_std.h"
-#include "src/object.h"
-#include "src/unicode.h"
-
-namespace interpreter = utakata::interpreter;
-namespace unicode = utakata::unicode;
-namespace exception = utakata::exception;
-
-// 宣言のコメントを参照して下さい。
-interpreter::IObject* interpreter::IObject::GetCar() {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetCar`"));
-}
-
-// 宣言のコメントを参照して下さい。
-interpreter::IObject* interpreter::IObject::GetCdr() {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetCdr`"));
-}
-
-// 宣言のコメントを参照して下さい。
-void interpreter::IObject::SetCar(interpreter::IObject* car) {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `SetCar`"));
-}
-
-// 宣言のコメントを参照して下さい。
-void interpreter::IObject::SetCdr(interpreter::IObject* cdr) {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `SetCdr`"));
-}
-
-// 宣言のコメントを参照して下さい。
-bool interpreter::IObject::GetBoolean() const {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetBoolean`"));
-}
-
-// 宣言のコメントを参照して下さい。
-void interpreter::IObject::SetBoolean(bool b) {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `SetBoolean`"));
-}
-
-// 宣言のコメントを参照して下さい。
-const unicode::UniString& interpreter::IObject::GetSymbolName() const {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetSymbolName`"));
-}
-
-// 宣言のコメントを参照して下さい。
-interpreter::IObject* interpreter::IObject::GetBindObject() {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetBindObject`"));
-}
-
-// 宣言のコメントを参照して下さい。
-void interpreter::IObject::SetBindObject(const interpreter::IObject* object) {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `SetBindObject`"));
-}
-
-// 宣言のコメントを参照して下さい。
-const unicode::UniString& interpreter::IObject::GetString() const {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetString`"));
-}
-
-// 宣言のコメントを参照して下さい。
-int interpreter::IObject::GetNumber() const {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetNumber`"));
-}
-
-// 宣言のコメントを参照して下さい。
-void interpreter::IObject::SetNumber(int number) {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `SetNumber`"));
-}
-
-// 宣言のコメントを参照して下さい。
-const unicode::UniChar& interpreter::IObject::GetCharactor() const {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetCharactor`"));
-}
-
-// 宣言のコメントを参照して下さい。
-std::vector<interpreter::IObject*>& interpreter::IObject::GetVector() {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetVector`"));
-}
-
-// 宣言のコメントを参照して下さい。
-std::vector<interpreter::IObject*>& interpreter::IObject::GetBytevector() {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetBytevector`"));
-}
index 0080d7c..e515570 100644 (file)
@@ -7,91 +7,103 @@ namespace datum = utakata::datum;
 namespace unicode = utakata::unicode;
 namespace exception = utakata::exception;
 
-// 宣言のコメントを参照して下さい。
-void datum::IDatumBase::SetCar(datum::IDatumBase* car) {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `SetCar`"));
+/// To string datum
+
+// 宣言のコメントを参照してください。
+const unicode::UniString& datum::String::ToString() const {
+  return *string_;
+}
+
+// 宣言のコメントを参照してください。
+datum::IDatumBase* datum::String::Eval(interpreter::Environment* env) {
+  return NULL;
+}
+
+// 宣言のコメントを参照してください。
+const unicode::UniString& datum::String::GetString() const {
+  return *string_;
 }
 
-// 宣言のコメントを参照して下さい。
-void datum::IDatumBase::SetCdr(datum::IDatumBase* cdr) {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `SetCdr`"));
+// 宣言のコメントを参照してください。
+const lexer::Token& datum::String::GetBaseToken() const {
+  return *token_;
 }
 
-// 宣言のコメントを参照して下さい。
-bool datum::IDatumBase::GetBoolean() const {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetBoolean`"));
+/// To symbol datum
+
+// 宣言のコメントを参照してください。
+const unicode::UniString& datum::Symbol::ToString() const {
+  return *symbol_;
 }
 
-// 宣言のコメントを参照して下さい。
-void datum::IDatumBase::SetBoolean(bool b) {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `SetBoolean`"));
+// 宣言のコメントを参照してください。
+datum::IDatumBase* datum::Symbol::Eval(interpreter::Environment* env) {
+  return NULL;
 }
 
-// 宣言のコメントを参照して下さい。
-const unicode::UniString& datum::IDatumBase::GetSymbolName() const {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetSymbolName`"));
+// 宣言のコメントを参照してください。
+const unicode::UniString& datum::Symbol::GetSymbolName() const {
+  return *symbol_;
 }
 
-// 宣言のコメントを参照して下さい。
-datum::IDatumBase* datum::IDatumBase::GetBindObject() {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetBindObject`"));
+// 宣言のコメントを参照してください。
+const lexer::Token& datum::String::GetBaseToken() const {
+  return *token_;
 }
 
-// 宣言のコメントを参照して下さい。
-void datum::IDatumBase::SetBindObject(const datum::IDatumBase* object) {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `SetBindObject`"));
+// To charactor datum
+
+// 宣言のコメントを参照してください。
+const unicode::UniString& datum::Charactor::ToString() const {
+  return *charactor_name_;
 }
 
-// 宣言のコメントを参照して下さい。
-const unicode::UniString& datum::IDatumBase::GetString() const {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetString`"));
+// 宣言のコメントを参照してください。
+datum::IDatumBase* datum::Charactor::Eval(interpreter::Environment* env) {
+  return NULL;
 }
 
-// 宣言のコメントを参照して下さい。
-int datum::IDatumBase::GetNumber() const {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetNumber`"));
+// 宣言のコメントを参照してください。
+const unicode::UniChar& datum::Charactor::GetCharactor() const {
+  return *charactor_;
 }
 
-// 宣言のコメントを参照して下さい。
-void datum::IDatumBase::SetNumber(int number) {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `SetNumber`"));
+// 宣言のコメントを参照してください。
+const lexer::Token& datum::String::GetBaseToken() const {
+  return *token_;
+}
+
+// To boolean datum
+
+// 宣言のコメントを参照してください。
+const unicode::UniString& datum::Boolean::ToString() const {
+  return *original_string_;
 }
 
-// 宣言のコメントを参照して下さい。
-const unicode::UniChar& datum::IDatumBase::GetCharactor() const {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetCharactor`"));
+// 宣言のコメントを参照してください。
+datum::IDatumBase* datum::Boolean::Eval(interpreter::Environment* env) {
+  return NULL;
 }
 
-// 宣言のコメントを参照して下さい。
-const std::vector<datum::IDatumBase*>& datum::IDatumBase::GetVector() const {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetVector`"));
+// 宣言のコメントを参照してください。
+const lexer::Token& datum::String::GetBaseToken() const {
+  return *token_;
 }
 
-void datum::IDatumBase::SetVector(const std::vector<datum::IDatumBase*>& vector) {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `SetVector`"));
+/////////////////////
+// To number datum //
+/////////////////////
+// 宣言のコメントを参照してください。
+const unicode::UniString& datum::Number::ToString() const {
+  return *original_string_;
 }
 
-// 宣言のコメントを参照して下さい。
-const std::vector<datum::IDatumBase*>& datum::IDatumBase::GetBytevector() const {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetBytevector`"));
+// 宣言のコメントを参照してください。
+datum::IDatumBase* datum::Number::Eval(interpreter::Environment* env) {
+  return NULL;
 }
 
-// 宣言のコメントを参照して下さい。
-void datum::IDatumBase::SetBytevector(const std::vector<datum::IDatumBase*>& vector) {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `SetBytevector`"));
+// 宣言のコメントを参照してください。
+const lexer::Token& datum::String::GetBaseToken() const {
+  return *token_;
 }
index beeec4d..ca63923 100755 (executable)
@@ -6,6 +6,7 @@
 #ifndef _UTAKATA_SRC_PARSER_DATUM_H_
 #define _UTAKATA_SRC_PARSER_DATUM_H_
 
+#include "lib/scoped_ptr.h"
 #include "src/parser/datum_base.h"
 
 namespace utakata {
@@ -23,10 +24,11 @@ class Environment;
 // 単純に文字列のみを保持し、それを返します。datumはcopyされないことが
 // 前提となっているため、文字列本体は内部においてscoped_ptrで保持され
 // ます。
-class String : public IDatumBase {
+class String : public Datum {
  public:
-  explicit String(const unicode::UniString& string)
-      : string_(new unicode::UniString(string)) {}
+  String(const lexer::Token& token, const unicode::UniString& string)
+      : Datum(token),
+        string_(new unicode::UniString(string)) {}
   virtual ~String() {}
 
   // このオブジェクトの文字列表現を返します。
@@ -35,7 +37,7 @@ class String : public IDatumBase {
 
   // オブジェクトを評価します。オブジェクトの評価時には、現在の
   // 環境が渡されます。Evalの結果として、任意のオブジェクトを返却します。
-  virtual IDatumBase* Eval(interpreter::Environment* env);
+  virtual datum::IDatumBase* Eval(interpreter::Environment* env);
 
   // 設定されている文字列を取得します。
   virtual const unicode::UniString& GetString() const;
@@ -45,15 +47,16 @@ class String : public IDatumBase {
  private:
 
   // 内部で保持される文字列です。オリジナルも同一となります。
-  scoped_ptr<unicode::UniString> string_;
+  akebono::scoped_ptr<unicode::UniString> string_;
 };
 
 // datum syntaxにおける<symbol>を表現するためのクラスです。
 // stringと同じく、symbolを構成する文字列のみを保持します。
-class Symbol : public IDatumBase {
+class Symbol : public Datum {
  public:
-  explicit Symbol(const unicode::UniString& symbol)
-      : symbol_(new unicode::UniString& string) {}
+  Symbol(const lexer::Token& token, const unicode::UniString& symbol)
+      : Datum(token),
+        symbol_(new unicode::UniString(symbol)) {}
   virtual ~Symbol() {}
 
   // このオブジェクトの文字列表現を返します。
@@ -62,24 +65,24 @@ class Symbol : public IDatumBase {
 
   // オブジェクトを評価します。オブジェクトの評価時には、現在の
   // 環境が渡されます。Evalの結果として、任意のオブジェクトを返却します。
-  virtual IDatumBase* Eval(interpreter::Environment* env);
+  virtual datum::IDatumBase* Eval(interpreter::Environment* env);
 
   // シンボル名を返します。ToStringと同一値を返します。
   virtual const unicode::UniString& GetSymbolName() const;
 
-  virtual datum::DatumType type() const {return datum::kSymbol;}
-
  private:
 
   // 内部で保持される文字列です。オリジナルも同一となります。
   akebono::scoped_ptr<unicode::UniString> symbol_;
 };
 
-class Charactor : public IDatumBase {
+class Charactor : public Datum {
  public:
-  explicit Charactor(const unicode::UniString& charactor_name,
-                     const unicode::UniChar& charactor)
-      : charactor_(new unicode::UniChar(charactor)),
+  Charactor(const lexer::Token& token,
+            const unicode::UniString& charactor_name,
+            const unicode::UniChar& charactor)
+      : Datum(token),
+        charactor_(new unicode::UniChar(charactor)),
         charactor_name_(new unicode::UniString(charactor_name)) {}
   virtual ~Charactor() {}
 
@@ -89,7 +92,7 @@ class Charactor : public IDatumBase {
 
   // オブジェクトを評価します。オブジェクトの評価時には、現在の
   // 環境が渡されます。Evalの結果として、任意のオブジェクトを返却します。
-  virtual IDatumBase* Eval(interpreter::Environment* env);
+  virtual datum::IDatumBase* Eval(interpreter::Environment* env);
 
   // 現在保持しているcharactor_を返却します。
   virtual const unicode::UniChar& GetCharactor() const;
@@ -105,7 +108,158 @@ class Charactor : public IDatumBase {
   akebono::scoped_ptr<unicode::UniString> charactor_name_;
 };
 
+// datum syntaxにおける<boolean>を表現します。
+// 内部では単純なboolean値を保存しています。
+// 渡された文字列を単純に返却するように変更することが可能であるため、
+// そのように変更される場合があります。
+class Boolean : public datum::Datum {
+ public:
+  Boolean(const lexer::Token& token, const unicode::UniString& base, bool auth)
+      : Datum(token),
+        boolean_value_(auth), original_string_(new unicode::UniString(base)) {}
+  virtual ~Boolean() {}
+
+  // このオブジェクトの文字列表現を返します。
+  // 返した文字列表現は、外部によって展開されます。
+  virtual const unicode::UniString& ToString() const;
+
+  // オブジェクトを評価します。オブジェクトの評価時には、現在の
+  // 環境が渡されます。Evalの結果として、任意のオブジェクトを返却します。
+  virtual datum::IDatumBase* Eval(interpreter::Environment* env);
+
+  virtual bool GetBoolean() const {return boolean_value_;}
+
+  virtual void SetBoolean(bool b) {boolean_value_ = b;}
+
+  virtual datum::DatumType type() const {return datum::kCharactor;}
+
+ private:
+
+  // 真偽値を直接保存します。
+  bool boolean_value_;
+
+  // 真偽値の文字列をそのまま保存します。
+  akebono::scoped_ptr<unicode::UniString> original_string_;
 };
+
+// datum syntaxにおける<number>を表現します。
+// 内部ではutakata::number::Numberを直接保存しており、そのデータを返却
+// することで実現します。
+// 渡された文字列を単純に返却するように変更することが可能であるため、
+// そのように変更される場合があります。
+class Number : public datum::Datum {
+ public:
+  Number(const lexer::Token& token, const unicode::UniString& base, int number)
+      : Datum(token),
+        tmp_number_(number), original_string_(new unicode::UniString(base)) {}
+  virtual ~Number() {}
+
+  // このオブジェクトの文字列表現を返します。
+  // 返した文字列表現は、外部によって展開されます。
+  virtual const unicode::UniString& ToString() const;
+
+  // オブジェクトを評価します。オブジェクトの評価時には、現在の
+  // 環境が渡されます。Evalの結果として、任意のオブジェクトを返却します。
+  virtual datum::IDatumBase* Eval(interpreter::Environment* env);
+
+  // 設定されているNumericオブジェクトを取得します。
+  virtual int GetNumber() const;
+
+  // Numericオブジェクトを設定します。
+  virtual void SetNumber(int num);
+
+  virtual datum::DatumType type() const {return datum::kNumber;}
+
+  virtual const lexer::Token& GetBaseToken() const;
+
+ private:
+
+  // 数値オブジェクトを設定します。
+  int tmp_number_;
+
+  // 真偽値の文字列をそのまま保存します。
+  akebono::scoped_ptr<unicode::UniString> original_string_;
 };
 
+// compound datum内のlist>を構築するためのconsセルです。
+// Consセル自体はいかなるデータも保存しません。
+class Cons : public datum::Datum {
+ public:
+  explicit Cons(const lexer::Token& token) : Datum(token) {}
+  virtual ~Cons() {}
+
+  // このオブジェクトの文字列表現を返します。
+  // 返した文字列表現は、外部によって展開されます。
+  virtual const unicode::UniString& ToString() const;
+
+  // オブジェクトを評価します。オブジェクトの評価時には、現在の
+  // 環境が渡されます。Evalの結果として、任意のオブジェクトを返却します。
+  virtual datum::IDatumBase* Eval(interpreter::Environment* env);
+
+  // datum::DatumTypeによって表現されるDatumを返します。
+  virtual datum::DatumType type() const {return datum::kCons;}
+};
+
+// datum syntaxにおける<vector>を表します。
+// compound datum に該当するデータの内、vector/listについては、Eval時に
+// 初めて構造が確定するため、datumの時点では、構文木の構造がそのまま存在
+// しているのみとなります。
+class Vector : public datum::Datum {
+public:
+  explicit Vector(const lexer::Token& token) : Datum(token) {}
+  virtual ~Vector() {}
+
+  // このオブジェクトの文字列表現を返します。
+  // 返した文字列表現は、外部によって展開されます。
+  virtual const unicode::UniString& ToString() const;
+
+  // オブジェクトを評価します。オブジェクトの評価時には、現在の
+  // 環境が渡されます。Evalの結果として、任意のオブジェクトを返却します。
+  virtual datum::IDatumBase* Eval(interpreter::Environment* env);
+
+  virtual datum::DatumType type() const {return datum::kVector;}
+};
+
+// datum syntaxにおける<bytevector>を表します。
+// bytevectorは、0-255までのNumberのみを保存することができますが、
+// 設定時点でそれは確定することができるため、特にBytevectorでは何も
+// 行いません。
+class Bytevector : public datum::Datum {
+public:
+  explicit Bytevector(const lexer::Token& token)
+      : Datum(token), datum_list_() {}
+  virtual ~Bytevector() {}
+
+  // このオブジェクトの文字列表現を返します。
+  // 返した文字列表現は、外部によって展開されます。
+  virtual const unicode::UniString& ToString() const;
+
+  // オブジェクトを評価します。オブジェクトの評価時には、現在の
+  // 環境が渡されます。Evalの結果として、任意のオブジェクトを返却します。
+  virtual datum::IDatumBase* Eval(interpreter::Environment* env);
+
+  // 内部で保持しているdatumのvectorを返します。
+  virtual const std::vector<akebono::smart_ptr<Datum> >& GetBytevector() const {
+    return datum_list_;
+  }
+
+  // 渡されたvectorを設定します。
+  virtual void SetBytevector(
+      const std::vector<akebono::smart_ptr<Datum> >& vector) {
+    datum_list_ = vector;
+  }
+
+  virtual datum::DatumType type() const {return datum::kBytevector;}
+
+ private:
+
+  // 内部に内包しているDatumのリストとなります。
+  // 内部に内包することが可能なのは、任意のdatumであるため、この時点
+  // では一意に確定はしません。
+  std::vector<akebono::smart_ptr<Datum> > datum_list_;
+};
+
+}
+}
+
 #endif /* _UTAKATA_SRC_PARSER_DATUM_H_ */
index 0080d7c..4e0ad6b 100644 (file)
@@ -8,18 +8,6 @@ namespace unicode = utakata::unicode;
 namespace exception = utakata::exception;
 
 // 宣言のコメントを参照して下さい。
-void datum::IDatumBase::SetCar(datum::IDatumBase* car) {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `SetCar`"));
-}
-
-// 宣言のコメントを参照して下さい。
-void datum::IDatumBase::SetCdr(datum::IDatumBase* cdr) {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `SetCdr`"));
-}
-
-// 宣言のコメントを参照して下さい。
 bool datum::IDatumBase::GetBoolean() const {
   THROW_EXCEPTION_(exception::NotImplementedException,
                    unicode::Convert("Not implemented `GetBoolean`"));
@@ -38,18 +26,6 @@ const unicode::UniString& datum::IDatumBase::GetSymbolName() const {
 }
 
 // 宣言のコメントを参照して下さい。
-datum::IDatumBase* datum::IDatumBase::GetBindObject() {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `GetBindObject`"));
-}
-
-// 宣言のコメントを参照して下さい。
-void datum::IDatumBase::SetBindObject(const datum::IDatumBase* object) {
-  THROW_EXCEPTION_(exception::NotImplementedException,
-                   unicode::Convert("Not implemented `SetBindObject`"));
-}
-
-// 宣言のコメントを参照して下さい。
 const unicode::UniString& datum::IDatumBase::GetString() const {
   THROW_EXCEPTION_(exception::NotImplementedException,
                    unicode::Convert("Not implemented `GetString`"));
@@ -95,3 +71,13 @@ void datum::IDatumBase::SetBytevector(const std::vector<datum::IDatumBase*>& vec
   THROW_EXCEPTION_(exception::NotImplementedException,
                    unicode::Convert("Not implemented `SetBytevector`"));
 }
+
+
+// 別のtokenを生成します。このtokenはdatum毎に元々のコピーを作成しています。
+datum::Datum::Datum(const lexer::Token& token)
+    : token_(new lexer::Token(token)) {}
+
+// 宣言のコメントを参照して下さい
+const lexer::Token& datum::Datum::GetBaseToken() const {
+  return *token_;
+}
index 0a5bfd1..f27ebbd 100755 (executable)
@@ -8,6 +8,7 @@
 
 #include <vector>
 #include "lib/uncopyable.h"
+#include "lib/smart_ptr.h"
 
 namespace utakata {
 
@@ -16,6 +17,10 @@ class UniString;
 class UniChar;
 }
 
+namespace interpreter {
+class Environment;
+} // end of namespace interpreter
+
 namespace datum {
 
 // IDatumBaseが実装するDatumを表現します。
@@ -26,21 +31,32 @@ enum DatumType {
   kSymbol,
   kCons,
   kVector,
-  kByteVector,
+  kBytevector,
   kNumber,
   kCharactor,
   kBoolean,
-}
-
-class Environment;
+};
 
 // <datum>を表現するためのクラスです。このクラスにおいては、すべてのdatum
 // を表現するに十分なインターフェースを提供します。
 // それぞれのdatumに不要なインターフェースについては、標準で
 // datum::NotImplementException例外が発生されるようになっています。
 // また、datumはデータ構造をそのまま表現するため、コピーは不可能となっています。
-// compound datumの内、listについては、consのみで表現され、データは実際には
-// 保持しません。
+// ただし、datum syntaxの制限上、compound datumについては、bytevector
+// を除いて、すべてbinary tree上に展開された状態で存在しています。
+// これは、list/vectorはcompound datumを内包することができるため、
+// 式として評価することができず、外部表現として確定することができないためです。
+// そのため、datumではcons/vectorという区分は用意されますが、
+// cons/vector専用のインターフェースは用意されません。
+// cons/vectorからは、evalによって、実際に利用されるcons/vectorを生成する
+// ことが出来るようになります。
+//
+// datumは、データ構造の元となったTokenを保持します。datum syntaxにおいて、
+// それぞれ以下のTokenを返却します。
+//   <lexeme datum> - 各一致するtokenをそのまま保持します
+//   <compound datum> - 各list,vector,bytevectorの開始時点のTokenを返却します。
+//                      ただし、abbreviationについては、対応する構造に自動的に変換されています。
+//                      その場合でも、開始時点のTokenが返却されます。
 class IDatumBase : private akebono::uncopyable {
  public:
   IDatumBase() {}
@@ -85,26 +101,40 @@ class IDatumBase : private akebono::uncopyable {
   // 設定されている文字を取得します。
   virtual const unicode::UniChar& GetCharactor() const;
 
-  /// Vectorオブジェクトに対するインターフェースです。
-
-  // 配列への参照を取得します。
-  virtual const std::vector<IDatumBase*>& GetVector() const;
-
-  // 配列を設定します。
-  virtual void SetVector(const std::vector<IDatumBase*>& vector);
-
   /// Bytevectorオブジェクトに対するインターフェースです。
 
   // ByteVectorへの参照を取得します。
-  virtual const std::vector<IDatumBase*>& GetBytevector() const;
+  virtual const std::vector<akebono::smart_ptr<IDatumBase> >&
+  GetBytevector() const;
 
   // Bytevectorを設定します。
-  virtual void SetBytevector(const std::vector<IDatumBase*>& vector);
+  virtual void SetBytevector(
+      const std::vector<akebono::smart_ptr<IDatumBase> >& vector);
 
   // datum::DatumTypeによって表現されるDatumを返します。
   virtual datum::DatumType type() const = 0;
+
+  // datumが構築された時に元となったTokenを返却します。
+  virtual const lexer::Token& GetBaseToken() const = 0;
 };
+
+
+// IDatumBaseから、共通であるトークン返却部分のみを実装しています。
+// インターフェースにデータを保持させないための実装であり、他の
+// 実装はこのDatumを継承します。
+class Datum : public IDatumBase {
+ public:
+  Datum(const lexer::Token& token);
+  virtual ~Datum() {}
+
+  // datumが構築された時に元となったTokenを返却します。
+  virtual const lexer::Token& GetBaseToken() const;
+
+ private:
+
+  akebono::smart_ptr<lexer::Token> token_;
 };
-};
+}
+}
 
 #endif /* _UTAKATA_SRC_PARSER_DATUM_BASE_H_ */
diff --git a/src/parser/datum_parser.cpp b/src/parser/datum_parser.cpp
new file mode 100755 (executable)
index 0000000..0183c2f
--- /dev/null
@@ -0,0 +1,453 @@
+// #include "src/parser/datum_parser.h"
+
+// #include "parser.h"
+// #include "lexeme.h"
+// #include "lexeme_data.h"
+// #include "lexer.h"
+// #include "lexeme_id.h"
+// #include "datum_id.h"
+// #include "reader.h"
+// #include "object.h"
+// #include "gc.h"
+// #include "primitive.h"
+// #include "primitive_class.h"
+// #include "primitive_util.h"
+// #include "data_castor.h"
+
+// using namespace utakata;
+// using namespace utakata::parser;
+// using namespace utakata::lexeme;
+// using namespace utakata::interpreter;
+
+// parser::DatumException::DatumException(std::string str) : str_()
+// {
+//     // エラーメッセージを定義する。
+//     std::stringstream ss;
+//     ss << "datum error ! -- message : [" << str << "]" << std::endl;
+//     str_ = ss.str();
+// }
+
+// const char* parser::DatumException::what() const throw()
+// {
+//     return str_.c_str();
+// }
+
+// ////////////////////////////
+// // Parser Implementations //
+// ///////////////////////////
+
+// parser::Parser::Parser(smart_ptr<lexer::Lexer> l) : lexer_(l),
+//                                                     handler_()
+// {
+//     // 初期状態用ハンドラの設定
+//     std::pair<PARSERSTATUS, smart_ptr<IParserHandler> > p;
+//     p.first = PS_INIT;
+//     p.second.add(new InitHandler);
+//     handler_.insert(p);
+
+//     // リスト内部用ハンドラの設定
+//     p.first = PS_LIST;
+//     p.second.add(new ListHandler);
+//     handler_.insert(p);
+
+//     // .内用ハンドラの設定
+//     p.first = PS_END_DOT;
+//     p.second.add(new DotEndHandler);
+//     handler_.insert(p);
+
+//     // abbreviation 用ハンドラの設定
+//     p.first = PS_ABBREVIATION;
+//     p.second.add(new AbbrevHandler);
+//     handler_.insert(p);
+
+//     // error 用のハンドラの設定
+//     p.first = PS_ERROR;
+//     p.second.add(new ErrorHandler);
+//     handler_.insert(p);
+// }
+
+// smart_ptr<data::Object> parser::Parser::parse(smart_ptr<reader::StreamReader>& strm,
+//                                               gc::GarbageCollector& gc)
+// {
+//     HandlerData data(gc);
+//     data.status.push(PS_INIT);
+
+//     while(!data.status.empty()) {
+
+//         if(data.status.top() != PS_ERROR)
+//         {
+//             if (data.chain)
+//             {
+//                 data.chain = false;
+//             }
+//             else
+//             {
+//                 data.lexm = lexer_->lex(strm);
+//             }
+            
+//             if(data.lexm.isNull() ||
+//                data.lexm->getID() == lexeme::LexemeID::eos)
+//             {
+//                 break;
+//             }
+//             // 基本的にすべてハンドラに任せる。
+//             handler_[data.status.top()]->exec(data);
+//         }
+//         else
+//         {
+//             // ERROR だったら、強制的にハンドラを回してループから抜ける。
+//             handler_[data.status.top()]->exec(data);
+//         }
+//     }
+
+//     // stackのtopにはmainが殘ったままなので、data.stackのtopを追加してやる。
+//     smart_ptr<data::Object> ret(new data::Object(data.stack.top()));
+//     return ret;
+// }
+
+// bool parser::isAbbrev(smart_ptr<lexeme::ILexeme> l)
+// {
+//     // abbreviation かどうかを判別する。
+//     switch(l->getID().toEnum())
+//     {
+//     case lexeme::LexemeID::BACKQUOTE:        return true;
+//     case lexeme::LexemeID::QUOTE:            return true;
+//     case lexeme::LexemeID::UNQUOTE:          return true;
+//     case lexeme::LexemeID::UNQUOTESPLICING:  return true;
+//     case lexeme::LexemeID::SYNTAX:           return true;
+//     case lexeme::LexemeID::QUASISYNTAX:      return true;
+//     case lexeme::LexemeID::UNSYNTAX:         return true;
+//     case lexeme::LexemeID::UNSYNTAXSPLICING: return true;
+//     default:
+//         return false;
+//     }
+// }
+
+// interpreter::IObject* parser::makePrimitiveFromLexeme(smart_ptr<lexeme::ILexeme> l)
+// {
+//     // 各lexemeに対応した固定lexemeを返す。
+//     interpreter::IObject* o = NULL;
+//     switch (l->getID().toEnum())
+//     {
+//     case lexeme::LexemeID::STRING:
+//         return util::makeString(l->getData()->string->str);
+//     case lexeme::LexemeID::CHARACTOR:
+//         return util::makeCharactor(l->getData()->charactor->spec);
+//     case lexeme::LexemeID::IDENTIFIER:
+//         return util::makeSymbol(l->getData()->symbol->id);
+//     case lexeme::LexemeID::BOOLEAN:
+//         return util::makeBoolean(l->getData()->boolean->boolean);
+//     case lexeme::LexemeID::NUMBER:
+//     {
+//         lexeme::NumberData& t = *(l->getData()->number);
+//         return util::makeNumber(t.real, t.imagin, t.exact,
+//                                 t.radix);
+//     }
+//     case lexeme::LexemeID::BACKQUOTE:
+//         return util::Abbrev<primitive::Quasiquote>::make();
+//     case lexeme::LexemeID::QUOTE:
+//         return util::Abbrev<primitive::Quote>::make();
+//     case lexeme::LexemeID::UNQUOTE:
+//         return util::Abbrev<primitive::Unquote>::make();
+//     case lexeme::LexemeID::UNQUOTESPLICING:
+//         return util::Abbrev<primitive::UnquoteSplicing>::make();
+//     case lexeme::LexemeID::SYNTAX:
+//         return util::Abbrev<primitive::Syntax>::make();
+//     case lexeme::LexemeID::QUASISYNTAX:
+//         return util::Abbrev<primitive::Quasisyntax>::make();
+//     case lexeme::LexemeID::UNSYNTAX:
+//         return util::Abbrev<primitive::Unsyntax>::make();
+//     case lexeme::LexemeID::UNSYNTAXSPLICING:
+//         return util::Abbrev<primitive::UnsyntaxSplicing>::make();
+//     default:
+//         break;
+//     }
+
+//     return o;
+// }
+
+// /////////////////////
+// // parser handlers //
+// /////////////////////
+
+// bool InitHandler::exec_(HandlerData& data)
+// {
+//     data.status.pop();
+//     // 初期状態の解釈処理を行う。
+//     if(data.lexm->getID() == lexeme::LexemeID::openParenthesis)
+//     {
+//         // 開き括弧である場合、compoundsに新しくpushして返る。
+//         data.compounds.push(std::vector<data::Object>());
+//         data.status.push(PS_LIST);
+//     }
+//     else if(data.lexm->getID() == lexeme::LexemeID::string ||
+//             data.lexm->getID() == lexeme::LexemeID::number ||
+//             data.lexm->getID() == lexeme::LexemeID::identifier ||
+//             data.lexm->getID() == lexeme::LexemeID::charactor ||
+//             data.lexm->getID() == lexeme::LexemeID::boolean)
+//     {
+//         // それぞれの場合、単純にstackに各オブジェクトをpushする。
+
+//         data::Object o = data::Object(false,
+//                                       data.gc.add(makePrimitiveFromLexeme(data.lexm)));
+//         if (data.compounds.empty())
+//         {
+//             data.stack.push(o);
+//         }
+//         else
+//         {
+//             data.compounds.top().push_back(o);
+//         }
+//     }
+//     else if(isAbbrev(data.lexm))
+//     {
+//         // abbreviation である場合には、 全体をリストに展開するため、carまでは
+//         // 設定された状態にする。
+//         std::vector<data::Object> v;
+//         v.push_back(data::Object(false,
+//                                  data.gc.add(makePrimitiveFromLexeme(data.lexm))));
+
+//         data.compounds.push(v);
+
+//         // status stack に、 PS_ABBREVIATIONとPS_INITを積む。
+//         data.status.push(PS_ABBREVIATION);
+//         data.status.push(PS_INIT);
+//     }
+//     else
+//     {
+//         throw DatumException("datum の開始記号ではありません");
+//     }
+
+//     return true;
+// }
+
+// // List 内部処理のハンドリング
+
+// bool ListHandler::exec_(HandlerData& data)
+// {
+//     // list の開始部分である場合。
+//     if(data.lexm->getID() == lexeme::LexemeID::openParenthesis)
+//     {
+//         // 更にcompoundsに追加して積む。
+//         data.compounds.push(std::vector<data::Object>());
+//         data.status.push(PS_LIST);
+//     }
+//     else if(data.lexm->getID() == lexeme::LexemeID::closeParenthesis)
+//     {
+//         // 原則として、閉括弧が来た時点で終了とするだけでよい。
+//         // 現在のtopにあるcompoundsが、データであるとされているため、
+//         // とりあえずtopにあるvectorをConsの繋がりに変換する。
+
+//         std::vector<data::Object> v = data.compounds.top(); data.compounds.pop();
+//         // vectorをConsへと変換するには、次のようにして後ろからやっていく
+//         // 方式が一番面倒がない。
+//         // 1. cdrをnil、carをvectorの末尾であるデータとしたconsを作成する。
+//         // 2. vectorの次のデータをcar、前のconsをcdrとしたconsを作成する。
+//         // 3. 先頭まで続ける。
+
+//         if (v.size() == 0)
+//         {
+//             // サイズが0の場合には、nilを設定する。
+//             data::Object o = data::Object(false,
+//                                           data.gc.add(util::makeNil()));
+//             pushList(data, o);
+//         }
+//         else
+//         {
+//             // 後ろから前に向かっていく。
+//             std::vector<data::Object>::reverse_iterator begin = v.rbegin(),
+//                 end = v.rend();
+//             // ちょっと面倒すぎるなこれ。
+//             data::Object o = data::Object(
+//                 false, data.gc.add(
+//                     util::makeCons(*begin,
+//                                    data::Object(false, data.gc.add(util::makeNil()))))
+//                 );
+//             ++begin;
+//             for (; begin != end; ++begin)
+//             {
+//                 // 順次oに再設定していく。
+//                 o = data::Object(
+//                     false, data.gc.add(
+//                         util::makeCons(*begin, o)));
+//             }
+//             pushList(data, o);
+//         }
+
+//         data.status.pop();
+//     }
+//     else if (data.lexm->getID() == lexeme::LexemeID::string ||
+//              data.lexm->getID() == lexeme::LexemeID::number ||
+//              data.lexm->getID() == lexeme::LexemeID::identifier ||
+//              data.lexm->getID() == lexeme::LexemeID::charactor ||
+//              data.lexm->getID() == lexeme::LexemeID::boolean)
+//     {
+//         // データスタックの頂上にあるvectorに追加する。
+//         data.compounds.top().push_back(
+//             data::Object(
+//                 false, data.gc.add(makePrimitiveFromLexeme(data.lexm))));
+//     }
+//     else if(isAbbrev(data.lexm))
+//     {
+//         // abbreviation は、結論としてはリストに展開される。carは常にabbreviationである
+//         // とすることで問題は無いので、作成したconsを、topに置くことで実現する。
+
+//         std::vector<data::Object> v;
+//         v.push_back(data::Object(false,
+//                                  data.gc.add(makePrimitiveFromLexeme(data.lexm))));
+
+//         data.compounds.push(v);
+
+//         // status stack に、 PS_ABBREVIATION と PS_INIT を積む。
+//         data.status.push(PS_ABBREVIATION);
+//         data.status.push(PS_INIT);
+//     }
+//     else if(data.lexm->getID() == lexeme::LexemeID::dot)
+//     {
+//         // .が来た場合で、topのvectorがemptyだったらどうしようもなくなるので終了。
+        
+//         if (data.compounds.top().empty())
+//         {
+//             data.status.push(PS_ERROR);
+//             data.error = "necessary one datum previous dot";
+//         }
+//         else
+//         {
+//             // この時点で、終わり方が確定したため、別のハンドラに任せる。
+//             // ただし、compoundの方は特に変化は必要が無いので、そちらはそのまま。
+//             data.status.pop();
+//             data.status.push(PS_END_DOT);
+//             data.status.push(PS_INIT);
+//         }
+//     }
+//     else
+//     {
+//         // 上記以外は許容しない。
+//         data.status.push(PS_ERROR);
+//     }
+
+//     return true;
+// }
+
+// void ListHandler::pushList(HandlerData& data, data::Object& o)
+// {
+//     if (!data.compounds.empty())
+//     {
+//         data.compounds.top().push_back(o);
+//     }
+//     else
+//     {
+//         data.stack.push(o);
+//     }
+// }
+
+// bool DotEndHandler::exec_(HandlerData& data)
+// {
+//     // .後の) を待つ部分のハンドラ。
+//     // このハンドラでは、) 以外が来た場合にはすべて構文エラーとなる。
+//     data.status.pop();
+//     if(data.lexm->getID() == lexeme::LexemeID::closeParenthesis)
+//     {
+//         // stackの頂点とcompoundsのトップを取得する。
+//         std::vector<data::Object> v = data.compounds.top(); data.compounds.pop();
+//         // vectorをConsへと変換するには、次のようにして後ろからやっていく
+//         // 方式が一番面倒がない。
+//         // 1. cdrをstackのtop、carをvectorの末尾であるデータとしたconsを作成する。
+//         // 2. vectorの次のデータをcar、前のconsをcdrとしたconsを作成する。
+//         // 3. 先頭まで続ける。
+
+//         {
+//             // 後ろから前に向かっていく。
+//             std::vector<data::Object>::reverse_iterator begin = v.rbegin(),
+//                 end = v.rend();
+//             // ちょっと面倒すぎるなこれ。
+//             // cdrにcompoundsの末尾を、carにその前を設定する。
+//             data::Object o = data::Object(
+//                 false, data.gc.add(
+//                         util::makeCons(begin[1], begin[0]))
+//                 );
+//             begin += 2;
+//             for (; begin != end; ++begin)
+//             {
+//                 // 順次oに再設定していく。
+//                 o = data::Object(
+//                     false, data.gc.add(
+//                         util::makeCons(*begin, o)));
+//             }
+
+//             if (!data.compounds.empty())
+//             {
+//                 data.compounds.top().push_back(o);
+//             }
+//             else
+//             {
+//                 data.stack.push(o);
+//             }
+//         }
+
+//         // ここまでは、すべてDataSpace内部のDataEntityを対象に処理しているため、
+//         // Objectで正しく受け渡しができていれば問題は発生しない。
+//     }
+//     else
+//     {
+//         // 上記以外は許容しない。
+//         data.status.push(PS_ERROR);
+//     }
+
+//     return true;
+// }
+
+// // Abbreviation 処理のハンドリング。
+
+// bool AbbrevHandler::exec_(HandlerData& data)
+// {
+//     // abbreviationの場合、すでにPS_INITを事前に積んであるため、
+//     // 一つ分のdatumが来ていることが確定している。
+//     // すでにabbreviation分のObjectはcompoundのtopに積んであるため、
+//     // consを作成して、compoundかstackのtopに積むだけ。
+
+//     std::vector<data::Object> v = data.compounds.top(); data.compounds.pop();
+
+//     if (v.size() != 2)
+//     {
+//         data.status.push(PS_ERROR);
+//     }
+//     else
+//     {
+//         // まだcompoundsが存在している場合には、これを返すようにする。
+//         data::Object c = data::Object(
+//             false, data.gc.add(util::makeCons(
+//                                    v[1],
+//                                    data::Object(false, data.gc.add(util::makeNil()))
+//                                    )));
+//         data::Object o =
+//             data::Object(false,
+//                          data.gc.add(util::makeCons(v[0], c)));
+//         if (!data.compounds.empty())
+//         {
+//             data.compounds.top().push_back(o);
+//         }
+//         else
+//         {
+//             data.stack.push(o);
+//         }
+//     }
+
+//     data.status.pop();
+//     data.chain = true;
+
+//     return true;
+// }
+
+// // syntax error のハンドリング
+
+// bool ErrorHandler::exec_(HandlerData& data)
+// {
+//     // 基本的にはエラーのハンドリングを行うだけ。
+//     // 一応発生した前後の位置と発生した lexeme くらいは表示したいかな。
+//     std::stringstream ss;
+//     ss << "syntax error:" << data.error;
+//     throw DatumException(ss.str());
+
+//     return true;
+// }
diff --git a/src/parser/datum_parser.h b/src/parser/datum_parser.h
new file mode 100755 (executable)
index 0000000..1033b28
--- /dev/null
@@ -0,0 +1,75 @@
+// 字句解析された字句より、datum を構築するparserを提供します。
+// 外部には以下のインターフェースのみが提供されています。
+// utakata::parser::DatumParser -- datum syntaxの構文解析結果を返却します。
+//
+// 返却されるのは、単純なdatumとbinary treeで構築された構文木が返却されます。
+#ifndef _UTAKATA_SRC_PARSER_DATUM_PARSER_H_
+#define _UTAKATA_SRC_PARSER_DATUM_PARSER_H_
+
+#include <string>
+#include <vector>
+#include <map>
+
+#include "lib/smart_ptr.h"
+#include "lib/scoped_ptr.h"
+#include "lib/binary_tree.h"
+
+namespace utakata {
+
+namespace datum {
+class IDatumBase;
+};
+
+namespace lexer {
+class ILexerCreater;
+};
+
+namespace reader {
+class EncodingReader;
+};
+
+namespace parser {
+
+class SyntaxError;
+
+// 渡されたreaderから、lexerに基づいてdatumを構築し、返却します。n
+// parse時に構文違反が発生したデータについては、GetSyntaxErrorから、
+// 構文違反が発生したDatumとエラー情報をまとめたSyntaxError構造体を
+// 取得することができます。
+// DatumParser自身からは例外が発生することはありません。
+class DatumParser {
+ public:
+  DatumParser() : use_lexer_() {}
+  virtual ~DatumParser() {}
+
+  // 渡されたreaderから、datum syntaxに基づいて変換された構文木を返却
+  // します。
+  // 返却された構文木は、呼出元において解体責任が生じます。
+  // 呼出元は、scoped_ptr等を利用して返されたポインタを保持するべきです。
+  // 内部にてなんらかのエラーが発生した場合、構文違反が発生します。
+  // また、何らかのエラーが発生した場合、返り値はNULLが返却されます。
+  akebono::binary_tree<datum::IDatumBase>* Parse(reader::EncodingReader* reader);
+
+  // 渡されたILexerCreatorを用いて、利用するLexerを設定します。
+  void SetLexerWithCreator(const ILexerCreator& creator);
+
+  // 構文違反が発生した場合に限り、作成されたSyntaxErrorが新規に作成されて
+  // 返却されます。
+  // 構文違反が発生していない場合、常にis_nullがtrueを返すsmart_ptrを
+  // 返却します。
+  const parser::SyntaxError& GetSyntaxError() const {
+    return *syntax_error_;
+  }
+
+ private:
+  // 内部で利用されるlexerを保存します。保存されるlexerは、set_lexer_creator
+  // によって新しいLexerCreatorが設定される度に更新されます。
+  akebono::scoped_ptr<lexer::IPartOfLexer> use_lexer_;
+
+  akebono::smart_ptr<parser::SyntaxError> syntax_error_;
+};
+
+}
+}
+
+#endif /* _UTAKATA_SRC_PARSER_DATUM_PARSER_H_ */
index f5bfb8e..d5dc4b7 100755 (executable)
@@ -84,13 +84,9 @@ TEST_F(NumberLexerTest, BinaryLex) {
   l = lexer.Lex(&reader);
   EXPECT_TRUE(l->string() == unicode::Convert("#b-0001"));
 
-  try {
   reader.Read();
   l = lexer.Lex(&reader);
   EXPECT_TRUE(l->string() == unicode::Convert("#b10/001"));
-  } catch (utakata::exception::Exception& e) {
-    std::cout << unicode::Convert(e.message()) << std::endl;
-  }
 }
 
 TEST_F(NumberLexerTest, OctetLex) {
index a03bf4e..93e7f89 100755 (executable)
@@ -34,12 +34,13 @@ class SchemeLexerTest : public ::testing::Test {
         1       ; identity of *\n \
         (* n (fact (- n '1))))))");
     gen->Punctuate("(define test () (print 'hoge `huga))");
+    gen->Punctuate("(define test () (print hoge)");
   }
 
   akebono::scoped_ptr<textarrayformat::TextArrayGenerator> gen;
 };
 
-TEST(ParserTest, LexemeToDatum) {
+TEST_F(ParserTest, LexemeToDatum) {
   textarrayformat::TextArrayReader textarray(*gen);
 
   reader::StringReader sr(textarray.GetBlockAt(0));
@@ -47,9 +48,9 @@ TEST(ParserTest, LexemeToDatum) {
   
   lexer::SchemeLexer lexer;
   parser::DatumParser parser;
-  parser.set_parser_creater(new lexer::SchemeLexerCreater());
+  parser.SetLexerWithCreator(lexer::SchemeLexerCreator());
 
-  akebono::scoped_ptr<akebono::binary_tree<datum::Datum> > tree(
+  akebono::scoped_ptr<akebono::binary_tree<datum::IDatumBase> > tree(
       parser.Parse(&reader));
 
   akebono::binary_tree<datum::Datum>::iterator it = tree->begin();
@@ -139,6 +140,24 @@ TEST(ParserTest, LexemeToDatum) {
   EXPECT_EQ(it->GetSymbolName(), unicode::Convert("1")); ++it;
 }
 
+// 例外となる構文についてのエラーをチェックします。
+TEST_F(ParserTest, GetCondition) {
+  textarrayformat::TextArrayReader textarray(*gen);
+
+  reader::StringReader sr(textarray.GetBlockAt(0));
+  reader::EncodingReader reader(&sr, new transcoder::UTF8Transcoder);
+  
+  lexer::SchemeLexer lexer;
+  parser::DatumParser parser;
+  parser.SetLexerWithCreator(lexer::SchemeLexerCreator());
+
+  akebono::scoped_ptr<akebono::binary_tree<datum::IDatumBase> > tree(
+      parser.Parse(&reader));
+
+  EXPECT_TRUE(tree.is_null());
+
+                     }
+
 int main(int argc, char** argv) {
   testing::InitGoogleTest(&argc, argv);
   return RUN_ALL_TESTS();