Skip to content

Commit e2eb58e

Browse files
committed
tagFormat develop
1 parent db5f6f3 commit e2eb58e

File tree

9 files changed

+122
-14
lines changed

9 files changed

+122
-14
lines changed

LuaParser/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ target_sources(LuaParser PUBLIC
3232
${LuaParser_SOURCE_DIR}/src/LuaFile.cpp
3333
${LuaParser_SOURCE_DIR}/src/LuaIdentify.cpp
3434
${LuaParser_SOURCE_DIR}/src/LuaCustomParser.cpp
35+
${LuaParser_SOURCE_DIR}/src/LuaDocParser.cpp
3536
)
3637

3738
target_link_libraries(LuaParser Util)

LuaParser/src/LuaDocParser.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#include "LuaParser/LuaDocParser.h"
2+

LuaParser/src/LuaFile.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ bool LuaFile::IsEmptyLine(int line)
133133
void LuaFile::PushLine(int offset)
134134
{
135135
_lineOffsetVec.push_back(offset);
136+
_linenumber++;
136137
}
137138

138139
bool LuaFile::OnlyEmptyCharBefore(int offset)

LuaParser/src/LuaParser.cpp

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ std::shared_ptr<LuaParser> LuaParser::LoadFromFile(std::string_view filename)
3333
std::shared_ptr<LuaParser> LuaParser::LoadFromBuffer(std::string&& buffer)
3434
{
3535
auto file = std::make_shared<LuaFile>("chunk", std::move(buffer));
36-
36+
3737
auto tokenParser = std::make_shared<LuaTokenParser>(file);
3838

3939
return std::make_shared<LuaParser>(tokenParser);
@@ -205,7 +205,7 @@ void LuaParser::StatementList(std::shared_ptr<LuaAstNode> blockNode)
205205

206206
void LuaParser::Statement(std::shared_ptr<LuaAstNode> blockNode)
207207
{
208-
switch (_tokenParser->Current().TokenType)
208+
switch (_tokenParser->CurrentWithComment().TokenType)
209209
{
210210
case ';':
211211
{
@@ -276,6 +276,18 @@ void LuaParser::Statement(std::shared_ptr<LuaAstNode> blockNode)
276276
GotoStatement(blockNode);
277277
break;
278278
}
279+
case TK_LONG_COMMENT:
280+
case TK_SHORT_COMMENT:
281+
case TK_SHEBANG:
282+
{
283+
Comment(blockNode);
284+
break;
285+
}
286+
case TK_DOC_COMMENT:
287+
{
288+
_tokenParser->Next();
289+
break;
290+
}
279291
default:
280292
{
281293
ExpressionStatement(blockNode);
@@ -553,6 +565,35 @@ void LuaParser::AssignStatement(std::shared_ptr<LuaAstNode> expressionListNode,
553565
}
554566
}
555567

568+
void LuaParser::Comment(std::shared_ptr<LuaAstNode> block)
569+
{
570+
std::shared_ptr<LuaAstNode> commentAst = CreateAstNode(LuaAstNodeType::Comment);
571+
if (_tokenParser->Current().TokenType == TK_SHORT_COMMENT)
572+
{
573+
commentAst->AddChild(CreateAstNodeFromCurrentToken(LuaAstNodeType::ShortComment));
574+
}
575+
else if (_tokenParser->Current().TokenType == TK_LONG_COMMENT)
576+
{
577+
commentAst->AddChild(CreateAstNodeFromCurrentToken(LuaAstNodeType::LongComment));
578+
}
579+
else
580+
{
581+
commentAst->AddChild(CreateAstNodeFromCurrentToken(LuaAstNodeType::ShebangComment));
582+
}
583+
_tokenParser->Next();
584+
585+
block->AddChild(commentAst);
586+
}
587+
588+
void LuaParser::DocStatement(std::shared_ptr<LuaAstNode> blockNode)
589+
{
590+
591+
// 退化情况
592+
std::shared_ptr<LuaAstNode> commentAst = CreateAstNode(LuaAstNodeType::Comment);
593+
commentAst->AddChild(CreateAstNodeFromCurrentToken(LuaAstNodeType::ShortComment));
594+
595+
blockNode->AddChild(commentAst);
596+
}
556597

557598
void LuaParser::Condition(std::shared_ptr<LuaAstNode> parent)
558599
{

LuaParser/src/LuaTokenParser.cpp

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,8 @@ bool LuaTokenParser::Parse()
6868

6969
if (!text.empty())
7070
{
71-
if (type == TK_LONG_COMMENT || type == TK_SHEBANG || type == TK_SHORT_COMMENT)
72-
{
73-
_commentTokens.emplace_back(type, text, TextRange(
74-
static_cast<int>(_buffStart), static_cast<int>(_buffIndex)));
75-
}
76-
else
77-
{
78-
_tokens.emplace_back(type, text, TextRange(
79-
static_cast<int>(_buffStart), static_cast<int>(_buffIndex)));
80-
}
71+
_tokens.emplace_back(type, text, TextRange(
72+
static_cast<int>(_buffStart), static_cast<int>(_buffIndex)));
8173
}
8274
else
8375
{
@@ -119,6 +111,37 @@ LuaToken& LuaTokenParser::LookAhead()
119111
}
120112

121113
LuaToken& LuaTokenParser::Current()
114+
{
115+
if (_currentIndex < _tokens.size())
116+
{
117+
do
118+
{
119+
switch (_tokens[_currentIndex].TokenType)
120+
{
121+
case TK_DOC_COMMENT:
122+
case TK_SHORT_COMMENT:
123+
case TK_LONG_COMMENT:
124+
case TK_SHEBANG:
125+
{
126+
_commentTokens.push_back(_tokens[_currentIndex]);
127+
Next();
128+
break;
129+
}
130+
default:
131+
{
132+
goto endLoop;
133+
}
134+
}
135+
}
136+
while (true);
137+
endLoop:
138+
return _tokens[_currentIndex];
139+
}
140+
141+
return _eosToken;
142+
}
143+
144+
LuaToken& LuaTokenParser::CurrentWithComment()
122145
{
123146
if (_currentIndex < _tokens.size())
124147
{
@@ -228,6 +251,7 @@ LuaTokenType LuaTokenParser::Lex()
228251
// is comment
229252
SaveAndNext();
230253

254+
LuaTokenType type = TK_SHORT_COMMENT;
231255
if (GetCurrentChar() == '[')
232256
{
233257
std::size_t sep = SkipSep();
@@ -237,14 +261,19 @@ LuaTokenType LuaTokenParser::Lex()
237261
return TK_LONG_COMMENT;
238262
}
239263
}
264+
else if (GetCurrentChar() == '-')
265+
{
266+
SaveAndNext();
267+
type = TK_DOC_COMMENT;
268+
}
240269

241270
// is short comment
242271
while (!CurrentIsNewLine() && GetCurrentChar() != EOZ)
243272
{
244273
SaveAndNext();
245274
}
246275

247-
return TK_SHORT_COMMENT;
276+
return type;
248277
}
249278
case '[':
250279
{
@@ -343,7 +372,7 @@ LuaTokenType LuaTokenParser::Lex()
343372
}
344373
case '"':
345374
case '\'':
346-
// extend support
375+
// extend support
347376
case '`':
348377
{
349378
ReadString(ch);
@@ -812,6 +841,17 @@ bool LuaTokenParser::IsReserved(std::string_view text)
812841
return LuaReserved.find(text) != LuaReserved.end();
813842
}
814843

844+
bool LuaTokenParser::IsInlineComment()
845+
{
846+
if (_tokens.empty())
847+
{
848+
return false;
849+
}
850+
851+
auto lastTokenLine = _file->GetLine(_tokens.back().Range.EndOffset);
852+
return _file->GetLine(static_cast<int>(_buffStart)) == lastTokenLine;
853+
}
854+
815855
void LuaTokenParser::PushLuaError(std::string_view message, TextRange range)
816856
{
817857
_errors.emplace_back(message, range);

include/LuaParser/LuaDocParser.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#pragma once
2+
3+
#include <string_view>
4+
5+
class LuaDocParser
6+
{
7+
public:
8+
LuaDocParser(std::string_view doc);
9+
~LuaDocParser();
10+
11+
private:
12+
std::string_view _source;
13+
14+
};

include/LuaParser/LuaParser.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ class LuaParser
7979

8080
void AssignStatement(std::shared_ptr<LuaAstNode> expressionListNode, std::shared_ptr<LuaAstNode> assignStatementNode);
8181

82+
void Comment(std::shared_ptr<LuaAstNode> block);
83+
84+
void DocStatement(std::shared_ptr<LuaAstNode> blockNode);
85+
8286
void ForNumber(std::shared_ptr<LuaAstNode> forStatement);
8387

8488
void ForList(std::shared_ptr<LuaAstNode> forStatement);

include/LuaParser/LuaTokenParser.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ class LuaTokenParser
2828

2929
LuaToken& Current();
3030

31+
LuaToken& CurrentWithComment();
32+
3133
int LastValidOffset();
3234

3335
std::string_view GetSource();
@@ -84,6 +86,8 @@ class LuaTokenParser
8486

8587
bool IsReserved(std::string_view text);
8688

89+
bool IsInlineComment();
90+
8791
void PushLuaError(std::string_view message, TextRange range);
8892

8993
int _linenumber;

include/LuaParser/LuaTokenTypeDetail.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ enum LuaTokenTypeDetail : int
4747
TK_STRING,
4848
// custom
4949
TK_SHORT_COMMENT,// 短注释
50+
TK_DOC_COMMENT, // emmylua doc
5051
TK_LONG_COMMENT, //长注释
5152
TK_SHEBANG, //shebang
5253
TK_UNKNOWN //对自定义tokenParser来说是未知

0 commit comments

Comments
 (0)