Skip to content

Commit 174a777

Browse files
committed
Fix a few parser/lexer bugs for better syntax hints/highlighting
1 parent ac58c30 commit 174a777

File tree

1 file changed

+37
-10
lines changed
  • EpochVisualStudio/EpochProjectType/Epoch/Epoch/Epoch.ProjectType

1 file changed

+37
-10
lines changed

EpochVisualStudio/EpochProjectType/Epoch/Epoch/Epoch.ProjectType/ProjectParser.cs

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public class FunctionDefinition
3131

3232
public List<FunctionParameter> Parameters = null;
3333
public string ReturnType;
34+
public Dictionary<string, FunctionTag> Tags;
3435

3536
public override string ToString()
3637
{
@@ -53,6 +54,12 @@ public override string ToString()
5354
}
5455
};
5556

57+
public class FunctionTag
58+
{
59+
public string TagName;
60+
public List<string> TagParams;
61+
};
62+
5663
private class StructureMember
5764
{
5865
public string Name;
@@ -72,14 +79,22 @@ private enum CharacterClass
7279

7380
private static CharacterClass LexerClassify(char c, CharacterClass currentclass)
7481
{
75-
if ("abcdef0123456789".Contains(c))
82+
if ("abcdef".Contains(c))
7683
{
7784
if (currentclass == CharacterClass.Literal)
7885
return CharacterClass.Literal;
7986

8087
return CharacterClass.Identifier;
8188
}
8289

90+
if ("0123456789".Contains(c))
91+
{
92+
if (currentclass == CharacterClass.Identifier)
93+
return CharacterClass.Identifier;
94+
95+
return CharacterClass.Literal;
96+
}
97+
8398
if (c == 'x')
8499
{
85100
if (currentclass == CharacterClass.Literal)
@@ -600,15 +615,17 @@ private static bool ParseFunction(string filename, List<string> tokens)
600615

601616
tokens.RemoveRange(0, 2);
602617

603-
ParsedFunctionNames[filename].Add(functionname);
618+
var sig = GetOrCreateFunctionSignature(filename, functionname);
604619

605620
if (tokens[0] != "[")
606621
{
607622
ParseFunctionParams(tokens, filename, functionname);
608623
ParseFunctionReturn(tokens, filename, functionname);
609624
}
610-
ParseFunctionTags(tokens);
625+
ParseFunctionTags(tokens, sig);
611626

627+
if (sig.Tags == null || !sig.Tags.ContainsKey("constructor"))
628+
ParsedFunctionNames[filename].Add(functionname);
612629

613630
if (tokens.Count <= 0 || tokens[0] != "{")
614631
return true;
@@ -710,12 +727,12 @@ private static void ParseFunctionParams(List<string> tokens, string filename, st
710727
param.Name = nametoken;
711728
sig.Parameters.Add(param);
712729
}
713-
}
714730

715-
if (tokens[0] != ",")
716-
return;
731+
if (tokens[0] != ",")
732+
return;
717733

718-
tokens.RemoveAt(0);
734+
tokens.RemoveAt(0);
735+
}
719736
}
720737

721738
private static void ParseFunctionReturn(List<string> tokens, string filename, string functionname)
@@ -747,6 +764,7 @@ private static FunctionDefinition GetOrCreateFunctionSignature(string filename,
747764
newfunc.FunctionName = functionname;
748765
newfunc.Parameters = new List<FunctionParameter>();
749766
newfunc.ReturnType = null;
767+
newfunc.Tags = null;
750768

751769
defs.Add(functionname, newfunc);
752770
return newfunc;
@@ -755,7 +773,7 @@ private static FunctionDefinition GetOrCreateFunctionSignature(string filename,
755773
return defs[functionname];
756774
}
757775

758-
private static void ParseFunctionTags(List<string> tokens)
776+
private static void ParseFunctionTags(List<string> tokens, FunctionDefinition func)
759777
{
760778
if (tokens.Count <= 0)
761779
return;
@@ -766,15 +784,24 @@ private static void ParseFunctionTags(List<string> tokens)
766784
tokens.RemoveAt(0);
767785

768786
while (tokens[0] != "]")
769-
ParseSingleFunctionTag(tokens);
787+
ParseSingleFunctionTag(tokens, func);
770788

771789
tokens.RemoveAt(0);
772790
}
773791

774-
private static void ParseSingleFunctionTag(List<string> tokens)
792+
private static void ParseSingleFunctionTag(List<string> tokens, FunctionDefinition func)
775793
{
794+
var tag = new FunctionTag();
795+
tag.TagName = tokens[0];
796+
797+
if (func.Tags == null)
798+
func.Tags = new Dictionary<string, FunctionTag>();
799+
800+
func.Tags.Add(tag.TagName, tag);
801+
776802
if (tokens[1] == "(")
777803
{
804+
// TODO - parse tag params
778805
tokens.RemoveRange(0, 2);
779806

780807
while (tokens[0] != ")")

0 commit comments

Comments
 (0)