/test/.deps/utf8_transcoder_test.po
/test/Rakefile
/test/charactor_lexer_test
+*.mf
\ No newline at end of file
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
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}
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
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
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
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)
## 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
/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
## ----------- ##
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
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.
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
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
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.
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
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
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. */
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. */
CONFIG_COMMANDS =
$ ./config.status
-on vaio_z
+on c2007
config.status:778: creating Makefile
config.status:778: creating Rakefile
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
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'
## 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'
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}'
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'
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'
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
S["am__include"]="include"
S["DEPDIR"]=".deps"
S["OBJEXT"]="o"
-S["EXEEXT"]=""
+S["EXEEXT"]=".exe"
S["ac_ct_CXX"]="g++"
S["CPPFLAGS"]=""
S["LDFLAGS"]=""
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"
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}"
#define _UTAKATA_SRC_LEXER_SCHEME_LEXER_H_
#include <vector>
+#include "src/lexer/lexer_interface.h"
#include "lib/smart_ptr.h"
namespace utakata {
};
} // end of namespace detail
-class SchemeLexer {
+class SchemeLexer : public IPartOfLexer {
// Scheme構文のうち、指定された条件に該当するような構文に該当する文字列
// が読出されているかどうかをチェックする機能のみを切り出した
// 限定Lexerです。
std::vector<akebono::smart_ptr<lexer::IPartOfLexer> > inner_lexers_;
};
+// SchemeLexerの生成を行います。処理自体は単純です。
+class SchemeLexerCreator : public ILexerCreator {
+ public:
+ virtual IPartOfLexer* Create() const {return new SchemeLexer();}
+};
+
}
}
#ifndef _UTAKATA_SRC_LEXER_TOKEN_H_
#define _UTAKATA_SRC_LEXER_TOKEN_H_
-
-
#include "lib/smart_ptr.h"
namespace utakata {
+++ /dev/null
-#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`"));
-}
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_;
}
#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 {
// 単純に文字列のみを保持し、それを返します。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() {}
// このオブジェクトの文字列表現を返します。
// オブジェクトを評価します。オブジェクトの評価時には、現在の
// 環境が渡されます。Evalの結果として、任意のオブジェクトを返却します。
- virtual IDatumBase* Eval(interpreter::Environment* env);
+ virtual datum::IDatumBase* Eval(interpreter::Environment* env);
// 設定されている文字列を取得します。
virtual const unicode::UniString& GetString() const;
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() {}
// このオブジェクトの文字列表現を返します。
// オブジェクトを評価します。オブジェクトの評価時には、現在の
// 環境が渡されます。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() {}
// オブジェクトを評価します。オブジェクトの評価時には、現在の
// 環境が渡されます。Evalの結果として、任意のオブジェクトを返却します。
- virtual IDatumBase* Eval(interpreter::Environment* env);
+ virtual datum::IDatumBase* Eval(interpreter::Environment* env);
// 現在保持しているcharactor_を返却します。
virtual const unicode::UniChar& GetCharactor() const;
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_ */
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`"));
}
// 宣言のコメントを参照して下さい。
-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`"));
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_;
+}
#include <vector>
#include "lib/uncopyable.h"
+#include "lib/smart_ptr.h"
namespace utakata {
class UniChar;
}
+namespace interpreter {
+class Environment;
+} // end of namespace interpreter
+
namespace datum {
// IDatumBaseが実装するDatumを表現します。
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() {}
// 設定されている文字を取得します。
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_ */
--- /dev/null
+// #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;
+// }
--- /dev/null
+// 字句解析された字句より、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_ */
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) {
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));
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();
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();