GZIP_ENV = --best
distuninstallcheck_listfiles = find . -type f -print
distcleancheck_listfiles = find . -type f -print
-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
+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
AWK = gawk
CC = gcc
CCDEPMODE = depmode=gcc3
CXX = g++
CXXDEPMODE = depmode=gcc3
CXXFLAGS = -g -O2
-CYGPATH_W = cygpath -w
+CYGPATH_W = echo
DEFS = -DHAVE_CONFIG_H
DEPDIR = .deps
ECHO_C =
ECHO_N = -n
ECHO_T =
EGREP = /bin/grep -E
-EXEEXT = .exe
+EXEEXT =
GREP = /bin/grep
-INSTALL = /bin/install -c
+INSTALL = /usr/bin/install -c
INSTALL_DATA = ${INSTALL} -m 644
INSTALL_PROGRAM = ${INSTALL}
INSTALL_SCRIPT = ${INSTALL}
LIBOBJS =
LIBS =
LTLIBOBJS =
-MAKEINFO = ${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run makeinfo
+MAKEINFO = ${SHELL} /home/derui/develop/utakata/missing --run makeinfo
MKDIR_P = /bin/mkdir -p
OBJEXT = o
PACKAGE = utakata
SHELL = /bin/sh
STRIP =
VERSION = 0.0.1
-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
+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
ac_ct_CC = gcc
ac_ct_CXX = g++
am__include = include
htmldir = ${docdir}
includedir = ${prefix}/include
infodir = ${datarootdir}/info
-install_sh = $(SHELL) /cygdrive/c/meadow/develop/utakata/install-sh
+install_sh = $(SHELL) /home/derui/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(".exe")
+TEST_PROGRAMS = TEST_SRCS.ext("")
-EXEEXT = ".exe"
+EXEEXT = ""
# lists of clean objects
CLEAN.include(OBJS, TEST_OBJECTS)
## Platform. ##
## --------- ##
-hostname = c2007
+hostname = vaio_z
uname -m = i686
-uname -r = 1.7.1(0.218/5/3)
-uname -s = CYGWIN_NT-5.0
-uname -v = 2009-12-07 11:48
+uname -r = 2.6.32-gentoo-r1
+uname -s = Linux
+uname -v = #2 SMP Wed Jan 13 20:45:37 JST 2010
-/usr/bin/uname -p = unknown
+/usr/bin/uname -p = Intel(R) Core(TM)2 Duo CPU P8800 @ 2.66GHz
/bin/uname -X = unknown
-/bin/arch = i686
+/bin/arch = unknown
/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: /bin/install -c
+configure:1951: result: /usr/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 /bin/g++
+configure:2402: found /usr/bin/g++
configure:2413: result: g++
configure:2440: checking for C++ compiler version
configure:2448: g++ --version >&5
-g++ (GCC) 4.3.4 20090804 (release) 1
+g++ (Gentoo 4.3.4 p1.0, pie-10.1.5) 4.3.4
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-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
+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'
Thread model: posix
-gcc version 4.3.4 20090804 (release) 1 (GCC)
+gcc version 4.3.4 (Gentoo 4.3.4 p1.0, pie-10.1.5)
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.exe
+configure:2561: result: a.out
configure:2580: checking whether the C++ compiler works
-configure:2590: ./a.exe
+configure:2590: ./a.out
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.exe conftest.cpp >&5
+configure:2632: g++ -o conftest conftest.cpp >&5
configure:2636: $? = 0
-configure:2662: result: .exe
+configure:2662: result:
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 /bin/gcc
+configure:3184: found /usr/bin/gcc
configure:3195: result: gcc
configure:3427: checking for C compiler version
configure:3435: gcc --version >&5
-gcc (GCC) 4.3.4 20090804 (release) 1
+gcc (Gentoo 4.3.4 p1.0, pie-10.1.5) 4.3.4
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-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
+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'
Thread model: posix
-gcc version 4.3.4 20090804 (release) 1 (GCC)
+gcc version 4.3.4 (Gentoo 4.3.4 p1.0, pie-10.1.5)
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.exe -g -O2 conftest.c >&5
+configure:4426: gcc -o conftest -g -O2 conftest.c >&5
configure:4430: $? = 0
-configure:4436: ./conftest.exe
+configure:4436: ./conftest
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 c2007
+on vaio_z
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='/bin/install -c'
+ac_cv_path_install='/usr/bin/install -c'
ac_cv_path_mkdir=/bin/mkdir
ac_cv_prog_AWK=gawk
ac_cv_prog_CPP='gcc -E'
## Output variables. ##
## ----------------- ##
-ACLOCAL='${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run aclocal-1.10'
+ACLOCAL='${SHELL} /home/derui/develop/utakata/missing --run aclocal-1.10'
AMDEPBACKSLASH='\'
AMDEP_FALSE='#'
AMDEP_TRUE=''
-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'
+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'
AWK='gawk'
CC='gcc'
CCDEPMODE='depmode=gcc3'
CXX='g++'
CXXDEPMODE='depmode=gcc3'
CXXFLAGS='-g -O2'
-CYGPATH_W='cygpath -w'
+CYGPATH_W='echo'
DEFS='-DHAVE_CONFIG_H'
DEPDIR='.deps'
ECHO_C=''
ECHO_N='-n'
ECHO_T=''
EGREP='/bin/grep -E'
-EXEEXT='.exe'
+EXEEXT=''
GREP='/bin/grep'
INSTALL_DATA='${INSTALL} -m 644'
INSTALL_PROGRAM='${INSTALL}'
LIBOBJS=''
LIBS=''
LTLIBOBJS=''
-MAKEINFO='${SHELL} /cygdrive/c/meadow/develop/utakata/missing --run makeinfo'
+MAKEINFO='${SHELL} /home/derui/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) /cygdrive/c/meadow/develop/utakata/install-sh'
+install_sh='$(SHELL) /home/derui/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='/cygdrive/c/meadow/develop/utakata'
+ac_pwd='/home/derui/develop/utakata'
srcdir='.'
-INSTALL='/bin/install -c'
+INSTALL='/usr/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"]=".exe"
+S["EXEEXT"]=""
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} /cygdrive/c/meadow/develop/utakata/missing --run tar"
+S["AMTAR"]="${SHELL} /home/derui/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) /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["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["VERSION"]="0.0.1"
S["PACKAGE"]="utakata"
-S["CYGPATH_W"]="cygpath -w"
+S["CYGPATH_W"]="echo"
S["am__isrc"]=""
S["INSTALL_DATA"]="${INSTALL} -m 644"
S["INSTALL_SCRIPT"]="${INSTALL}"
kUnsyntaxSplicing,
kUnquote,
kUnquoteSplicing,
+ kDatumComment,
+ kSpecialComment,
kUnToken,
};
}
unicode::UniString str(unicode::Convert(
- reader->Read(boolean.ReadToken(reader))));
+ reader->Read(boolean.previous_read_size())));
lexer::TermLexer<term::Delimiter> std_delimiter;
if (!reader->IsEof() && !std_delimiter.CheckToken(reader)) {
namespace unicode = utakata::unicode;
// 宣言のコメントを参照してください。
+bool lexer::detail::NestedLexer::Lex(reader::EncodingReader* reader) {
+ lexer::TermLexer<term::NestedCommentOpen> nested_open;
+ lexer::TermLexer<term::NestedCommentClose> nested_close;
+
+ if (!nested_open.CheckToken(reader)) {
+ return false;
+ }
+
+ reader->Read(nested_open.previous_read_size());
+ int nest_counter = 1;
+ while (!reader->IsEof() && nest_counter > 0) {
+ if (nested_open.CheckToken(reader)) {
+ reader->Read(nested_open.previous_read_size());
+ ++nest_counter;
+
+ } else if (nested_close.CheckToken(reader)) {
+ reader->Read(nested_close.previous_read_size());
+ --nest_counter;
+
+ } else {
+ reader->Read();
+ }
+ }
+
+ return true;
+}
+
+// 宣言のコメントを参照してください。
lexer::Lexeme* lexer::CommentLexer::Lex(reader::EncodingReader* reader) {
lexer::TermLexer<term::DatumComment> datum_comment;
lexer::TermLexer<term::SpecialComment> special_comment;
SkipByLineComment(reader);
} else if (datum_comment.CheckToken(reader)) {
- return lexer::Lexeme(unicode::UniString(), lexer::Lexeme::kDatumComment);
+ reader->Read(datum_comment.previous_read_size());
+ return new lexer::Lexeme(unicode::UniString(), lexer::Lexeme::kDatumComment);
+
} else if (special_comment.CheckToken(reader)) {
- reader->Read(special_comment.ReadToken(reader));
- return lexer::Lexeme(unicode::UniString(), lexer::Lexeme::kSpecialComment);
+ reader->Read(special_comment.previous_read_size());
+ return new lexer::Lexeme(unicode::UniString(), lexer::Lexeme::kSpecialComment);
} else {
lexer::detail::NestedLexer().Lex(reader);
}
return NULL;
}
+
+// ; の発見時点でこの関数が呼ばれるため、内部で先頭の一文字を
+// 読み飛ばしています。
+void lexer::CommentLexer::SkipByLineComment(reader::EncodingReader* reader) {
+ reader->Read();
+
+ lexer::TermLexer<term::LineEnding> line_ending;
+ while (!reader->IsEof()) {
+ if (line_ending.CheckToken(reader)) {
+ reader->Read(line_ending.previous_read_size());
+ break;
+ }
+ reader->Read();
+ }
+}
namespace lexer {
+namespace detail {
+
+// #| と |#に囲まれた領域をコメントとして読み飛ばします。
+// 正しくネストされている限り、無制限にネストさせることができます。
+class NestedLexer {
+ public:
+
+ // readerの先頭から、<nested comment>であるかをチェックし、<nested comment>
+ // に該当する部分の読み飛ばしを行います。
+ bool Lex(reader::EncodingReader* reader);
+};
+}
+
class Lexeme;
// <comment>に一致する字句を解釈する機能を提供します。
class CommentLexer : public IPartOfLexer {
// Parserは、受け取ったLexemeに対して処理を行うことができますが、
// コメントが必ず読み飛ばされることを保証しなければなりません。
lexer::Lexeme* Lex(reader::EncodingReader* reader);
+
+ private:
+
+ // ; 以降の行末までを読み飛ばします。
+ void SkipByLineComment(reader::EncodingReader* reader);
};
}
}
}
code->Append(unicode::Convert(reader->Read(
- peculiar_ident.ReadToken(reader))));
+ peculiar_ident.previous_read_size())));
if (*code == unicode::Convert("->")) {
lexer::TermLexer<term::Delimiter> delim;
if (!digit_10.CheckToken(reader)) {
break;
}
- unicode::Append(code, reader->Read(digit_10.ReadToken(reader)));
+ unicode::Append(code, reader->Read(digit_10.previous_read_size()));
}
const int kMantissaSize = 2;
}
unicode::UniString code(unicode::Convert(
- reader->Read(marker.ReadToken(reader))));
+ reader->Read(marker.previous_read_size())));
lexer::TermLexer<term::Sign> sign;
lexer::TermLexer<term::NumberDigit<10> > digit_10;
"must have sign after `exponent marker'"));
}
code.Append(unicode::Convert(
- reader->Read(marker.ReadToken(reader))));
+ reader->Read(marker.previous_read_size())));
if (!digit_10.CheckToken(reader)) {
THROW_EXCEPTION_(lexer::LexException, unicode::Convert(
break;
}
code.Append(unicode::Convert(
- reader->Read(marker.ReadToken(reader))));
+ reader->Read(marker.previous_read_size())));
}
string->Append(code);
unicode::UniString digit_string;
while (!reader->IsEof() && digit.CheckToken(reader)) {
- unicode::Append(digit_string, reader->Read(digit.ReadToken(reader)));
+ unicode::Append(digit_string, reader->Read(digit.previous_read_size()));
}
if (digit_string.IsEmpty()) {
code.Append(ch);
while (!reader->IsEof() && digit.CheckToken(reader)) {
- unicode::Append(code, reader->Read(digit.ReadToken(reader)));
+ unicode::Append(code, reader->Read(digit.previous_read_size()));
}
if (!suffix.Lex(reader, &code)) {
unicode::UniString code;
if (exactness.CheckToken(reader)) {
- unicode::Append(code, reader->Read(exactness.ReadToken(reader)));
+ unicode::Append(code, reader->Read(exactness.previous_read_size()));
if (CheckNextTokenInPrefix(&radix, reader, &code)) {
string->Append(code);
return true;
}
} else if (radix.CheckToken(reader)) {
- unicode::Append(code, reader->Read(radix.ReadToken(reader)));
+ unicode::Append(code, reader->Read(radix.previous_read_size()));
if (CheckNextTokenInPrefix(&exactness, reader, &code)) {
string->Append(code);
namespace unicode = utakata::unicode;
if (predicate->CheckToken(reader)) {
- unicode::Append(*string, reader->Read(predicate->ReadToken(reader)));
+ unicode::Append(*string, reader->Read(predicate->previous_read_size()));
return true;
}
return false;
lexer::TermLexer<term::NumberDigit<N> > digit;
unicode::UniString code;
while (!reader->IsEof() && digit.CheckToken(reader)) {
- unicode::Append(code, reader->Read(digit.ReadToken(reader)));
+ unicode::Append(code, reader->Read(digit.previous_read_size()));
}
if (code.IsEmpty()) {
unicode::UniString code;
if (sign.CheckToken(reader)) {
- unicode::Append(code, reader->Read(sign.ReadToken(reader)));
+ unicode::Append(code, reader->Read(sign.previous_read_size()));
if (ureal.Lex(reader, &code)) {
string->Append(code);
return true;
} else {
lexer::TermLexer<term::Sign> sign;
if (sign.CheckToken(reader)) {
- unsigned int read_size = sign.ReadToken(reader);
+ unsigned int read_size = sign.previous_read_size();
if (read_size != 0) {
- unicode::Append(code, reader->Read(sign.ReadToken(reader)));
+ unicode::Append(code, reader->Read(sign.previous_read_size()));
if (!CheckImaginaryPart(reader, &code)) {
THROW_EXCEPTION_(lexer::LexException, unicode::Convert(
"error imaginary part. read flag only."));
} else {
lexer::TermLexer<term::Sign> sign;
if (sign.CheckToken(reader)) {
- unsigned int read_size = sign.ReadToken(reader);
+ unsigned int read_size = sign.previous_read_size();
if (read_size == 0) {
return false;
} else if (!CheckImaginaryPart(reader, &code)) {
if (!ureal.Lex(reader, string)) {
if (naninf.CheckToken(reader)) {
- unicode::Append(*string, reader->Read(naninf.ReadToken(reader)));
+ unicode::Append(*string, reader->Read(naninf.previous_read_size()));
}
}
lexer::TermLexer<term::LineEnding> lineend;
while (intraline.CheckToken(reader) && !reader->IsEof()) {
- reader->Read(intraline.ReadToken(reader));
+ reader->Read(intraline.previous_read_size());
}
if (!lineend.CheckToken(reader)) {
THROW_EXCEPTION_(lexer::LexException,
unicode::Convert("must line ending after whitespaces"));
}
- reader->Read(lineend.ReadToken(reader));
+ reader->Read(lineend.previous_read_size());
while (intraline.CheckToken(reader) && !reader->IsEof()) {
- reader->Read(intraline.ReadToken(reader));
+ reader->Read(intraline.previous_read_size());
}
}
if (!string_delimiter.CheckToken(reader)) {
return NULL;
}
- reader->Read(string_delimiter.ReadToken(reader));
+ reader->Read(string_delimiter.previous_read_size());
lexer::EscapeLexer escape;
unicode::UniString str;
while (!reader->IsEof()) {
if (string_delimiter.CheckToken(reader)) {
- reader->Read(string_delimiter.ReadToken(reader));
+ reader->Read(string_delimiter.previous_read_size());
syntax_ok = true;
break;
}
case '"':
case ';':
case '#':
- *size = 1;
- return true;
+ *size = 1;
+ return true;
default:
return term::Whitespace()(reader, size);
}
// 宣言のコメントを参照してください。
bool term::Whitespace::operator()(reader::IReader* reader,
- unsigned int* size) {
+ unsigned int* size) {
unicode::UniChar ch(reader->Peek());
switch (ch.rawcode()) {
case '\r': // carriage return
case '\t': // tab
case '\v': // vertical tab
case '\f': // page
- *size = 1;
- return true;
+ *size = 1;
+ return true;
default:
return false;
}
// targetが\rである場合、次の一文字のチェックも必要となりますが、
// \r単体である場合でも、改行として見做されます。
bool term::LineEnding::operator()(reader::IReader* reader,
- unsigned int* size) {
+ unsigned int* size) {
unicode::UniChar ch(reader->Peek());
switch (ch.rawcode()) {
case '\n':
// 宣言のコメントを参照してください。
bool term::SpecialInitial::operator()(reader::IReader* reader,
- unsigned int* size) {
+ unsigned int* size) {
unicode::UniChar ch(reader->Peek());
switch (ch.rawcode()) {
case kExclamation:
case 'F':
case 'd':
case 'D':
- *size = 1;
- return true;
+ *size = 1;
+ return true;
default:
return false;
}
// 宣言のコメントを参照してください。
bool term::SpecialComment::operator()(reader::IReader* reader,
- unsigned int* size) {
+ unsigned int* size) {
unicode::UniString code(unicode::Convert(
reader->Peek(kSpecialCommentReadSize)));
if (code == unicode::Convert("#!r6rs")) {
}
return false;
}
+
+// 宣言のコメントを参照してください。
+bool term::NestedCommentOpen::operator()(reader::IReader* reader,
+ unsigned int* size) {
+ unicode::UniString code(unicode::Convert(
+ reader->Peek(kNestedCommentOpenReadSize)));
+ if (code == unicode::Convert("#|")) {
+ *size = kNestedCommentOpenReadSize;
+ return true;
+ }
+ return false;
+}
+
+// 宣言のコメントを参照してください。
+bool term::NestedCommentClose::operator()(reader::IReader* reader,
+ unsigned int* size) {
+ unicode::UniString code(unicode::Convert(
+ reader->Peek(kNestedCommentCloseReadSize)));
+ if (code == unicode::Convert("|#")) {
+ *size = kNestedCommentCloseReadSize;
+ return true;
+ }
+ return false;
+}
// trueを返した場合、sizeにはトークンの文字数が返却されます。
bool operator()(reader::IReader* reader, unsigned int* size);
};
+
+// #| のチェックを提供します。
+struct NestedCommentOpen {
+ // readerからチェックのために読出すサイズです。
+ static const int kNestedCommentOpenReadSize = 2;
+
+ // readerの先頭から、#|に一致するかどうかを返します。
+ // trueを返した場合、sizeにはトークンの文字数が返却されます。
+ bool operator()(reader::IReader* reader, unsigned int* size);
+};
+
+// |# のチェックを提供します。
+struct NestedCommentClose {
+ // readerからチェックのために読出すサイズです。
+ static const int kNestedCommentCloseReadSize = 2;
+
+ // readerの先頭から、|#に一致するかどうかを返します。
+ // trueを返した場合、sizeにはトークンの文字数が返却されます。
+ bool operator()(reader::IReader* reader, unsigned int* size);
+};
}
}
}
// 渡されたreaderの読み出し位置は更新されません。
virtual bool CheckToken(reader::EncodingReader* reader) = 0;
- // 渡されたreaderより、T()によって判別されたトークンを読み飛ばします。
- // 読み出しが行われた場合、readerの読み出し位置は更新されます。
- virtual int ReadToken(reader::EncodingReader* reader) = 0;
+ // 直前に実行されたCheckTokenの結果を返します。
+ virtual int previous_read_size() const = 0;
};
// 関数オブジェクトを渡すことで、渡した関数オブジェクトによって
class TermLexer : public TermLexerBase {
public:
- TermLexer() : checker_() {}
+ TermLexer() : checker_(), previous_read_size_(0) {}
// 渡されたreaderの先頭から、T()によって判別されるトークンが
// 読出せる場合、trueが返されます。
bool CheckToken(reader::EncodingReader* reader) {
unsigned int size = 0;
if (!checker_(reader, &size)) {
+ previous_read_size_ = size;
return false;
}
+ previous_read_size_ = size;
return true;
}
- // 渡されたreaderより、T()によって判別されたトークンを読み飛ばします。
- // 読み出しが行われた場合、readerの読み出し位置は更新されます。
- int ReadToken(reader::EncodingReader* reader) {
- unsigned int size = 0;
- if (!checker_(reader, &size)) {
- return 0;
- }
- return size;
- }
+ // 前回読み出しが行われた結果を取得します。
+ // CheckTokenがfalseを返した場合、0が設定されます。
+ int previous_read_size() const {return previous_read_size_;}
private:
// ()を定義した関数オブジェクトです。
T checker_;
+
+ // 前回CheckTokenを実行した結果です。
+ int previous_read_size_;
};
}
gen.reset(new textarrayformat::TextArrayGenerator("========="));
gen->Punctuate("(hoge) ; comment \nhuga");
gen->Punctuate("#!r6rs");
- gen->Punctuate("#| hoge \n #|ss");
+ gen->Punctuate("#| hoge \n |#ss");
gen->Punctuate("#| \nhoge #|huga|# \n|#123");
gen->Punctuate("#;data");
}
lexer::CommentLexer lexer;
akebono::scoped_ptr<lexer::Lexeme> l(lexer.Lex(&reader));
- EXPECT_TRUE(l.get() == NULL);
+ EXPECT_TRUE(l.get() != NULL);
+ EXPECT_EQ(l->type(), lexer::Lexeme::kSpecialComment);
+ reader.Read();
EXPECT_TRUE(reader.IsEof());
}
lexer::CommentLexer lexer;
l.reset(lexer.Lex(&reader));
- EXPECT_TRUE(l.get() == NULL);
+ EXPECT_TRUE(l.get() == NULL);
unicode::UniString tmp(unicode::Convert(reader.Read(2)));
EXPECT_TRUE(tmp == unicode::Convert("ss"));
}
lexer::CommentLexer lexer;
l.reset(lexer.Lex(&reader));
- EXPECT_TRUE(lexer.Lex(&reader));
+ EXPECT_TRUE(lexer.Lex(&reader) == NULL);
unicode::UniString tmp(unicode::Convert(reader.Read(3)));
EXPECT_TRUE(tmp == unicode::Convert("123"));
}
reader::EncodingReader reader(&sr, new transcoder::UTF8Transcoder);
lexer::CommentLexer lexer;
- // datum comment\82Ì\8fê\8d\87\82É\8cÀ\82è\81A\83g\81[\83N\83\93\82Ì\95Ô\8bp\82ª\95K\97v\82Æ\82È\82è\82Ü\82·\81B
- // \82±\82ê\82Í#; <interlexeme space> <datum>\82Ì<datum>\82ª\91O\95û\90é\8c¾\82³\82ê\82Ä\82¢\82é
- // \8aÖ\8cW\8fã\81A\8e\9a\8bå\89ð\90Í\82Å\82Í\82È\82\8d\\95¶\89ð\90Í\83\8c\83x\83\8b\82Å\82Ì\83R\83\81\83\93\83g\82ª\95K\97v\82Æ\82È\82é\82½\82ß\81A
- // \82»\82Ì\94»\95Ê\82ª\95K\97v\82Å\82 \82é\82½\82ß\82Å\82·\81B
- // datum comment\82Í\81A\82»\82Ì\90«\8e¿\8fã\81A\8aô\8fd\82É\82à\83l\83X\83g\82·\82é\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B
+ // datum commentの場合に限り、トークンの返却が必要となります。
+ // これは#; <interlexeme space> <datum>の<datum>が前方宣言されている
+ // 関係上、字句解析ではなく構文解析レベルでのコメントが必要となるため、
+ // その判別が必要であるためです。
+ // datum commentは、その性質上、幾重にもネストする可能性があります。
l.reset(lexer.Lex(&reader));
EXPECT_TRUE(l.get() != NULL);
unicode::UniString tmp(unicode::Convert(reader.Read(4)));