X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Flexer%2Fcomment_lexer.cpp;fp=src%2Flexer%2Fcomment_lexer.cpp;h=f3cad0b6e60d7610281e4f1d3a727e8ca8d16185;hb=0deadd8a7dadf4368b6926534474714493254ac7;hp=f76df955378b6a23b8d5846f016f8a92ad35d02e;hpb=fb54afeb9b80fe7fe397eb5f53bd85c7397c179f;p=simplecms%2Futakata.git diff --git a/src/lexer/comment_lexer.cpp b/src/lexer/comment_lexer.cpp index f76df95..f3cad0b 100755 --- a/src/lexer/comment_lexer.cpp +++ b/src/lexer/comment_lexer.cpp @@ -14,6 +14,34 @@ namespace term = utakata::lexer::term; namespace unicode = utakata::unicode; // 宣言のコメントを参照してください。 +bool lexer::detail::NestedLexer::Lex(reader::EncodingReader* reader) { + lexer::TermLexer nested_open; + lexer::TermLexer 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 datum_comment; lexer::TermLexer special_comment; @@ -23,13 +51,30 @@ lexer::Lexeme* lexer::CommentLexer::Lex(reader::EncodingReader* reader) { 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 line_ending; + while (!reader->IsEof()) { + if (line_ending.CheckToken(reader)) { + reader->Read(line_ending.previous_read_size()); + break; + } + reader->Read(); + } +}