feat: parser, ignore comments.

This commit is contained in:
redxef 2024-12-18 00:51:40 +01:00
parent 6d7cd33d04
commit 87dd4358d8
Signed by: redxef
GPG key ID: 7DAC3AA211CBD921
3 changed files with 29 additions and 1 deletions

View file

@ -40,6 +40,19 @@ namespace Jellyfin.Plugin.SmartPlaylist.Lisp.Compiler {
return new String(r);
}
Expression parse_comment(GroupingToken start, GroupingToken? end) {
Debug.Assert(end != null);
Debug.Assert(";".Contains(start.value));
while (_sts.Available() > 0) {
Token<string> t = _sts.Get();
if (t.value == end.value) {
break;
}
}
_sts.Commit();
return parse();
}
Expression parse_quote(GroupingToken start, GroupingToken? end) {
Debug.Assert(end == null);
Debug.Assert("'".Contains(start.value));
@ -53,6 +66,9 @@ namespace Jellyfin.Plugin.SmartPlaylist.Lisp.Compiler {
if ("'".Contains(start.value)) {
return parse_quote(start, end);
}
if (";".Contains(start.value)) {
return parse_comment(start, end);
}
Debug.Assert(end != null);
IList<Expression> expressions = new List<Expression>();
while (_sts.Available() > 0) {

View file

@ -43,7 +43,7 @@ namespace Jellyfin.Plugin.SmartPlaylist.Lisp.Compiler {
return null;
}
char t = program.Get();
if ("()\"'".Contains(t)) {
if ("()\"';".Contains(t)) {
return new GroupingToken(t.ToString());
}
return null;
@ -55,6 +55,8 @@ namespace Jellyfin.Plugin.SmartPlaylist.Lisp.Compiler {
return null;
} else if (_value == "'") {
return null;
} else if (_value == ";") {
return new GroupingToken("\n");
}
return new GroupingToken(_value);
}

View file

@ -76,6 +76,16 @@ namespace Tests
sts = StringTokenStream.generate(program);
p = new Parser(sts);
Assert.Equal(program, string.Format("{0}", p.parse()));
program = """
(begin ;this too
;;; this is a comment
t
)
""";
sts = StringTokenStream.generate(program);
p = new Parser(sts);
Assert.Equal("(begin t)", string.Format("{0}", p.parse()));
}
[Fact]