Compare commits
2 commits
6d7cd33d04
...
d5e8b69b70
Author | SHA1 | Date | |
---|---|---|---|
d5e8b69b70 | |||
87dd4358d8 |
3 changed files with 36 additions and 1 deletions
|
@ -40,6 +40,19 @@ namespace Jellyfin.Plugin.SmartPlaylist.Lisp.Compiler {
|
||||||
return new String(r);
|
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) {
|
Expression parse_quote(GroupingToken start, GroupingToken? end) {
|
||||||
Debug.Assert(end == null);
|
Debug.Assert(end == null);
|
||||||
Debug.Assert("'".Contains(start.value));
|
Debug.Assert("'".Contains(start.value));
|
||||||
|
@ -53,6 +66,9 @@ namespace Jellyfin.Plugin.SmartPlaylist.Lisp.Compiler {
|
||||||
if ("'".Contains(start.value)) {
|
if ("'".Contains(start.value)) {
|
||||||
return parse_quote(start, end);
|
return parse_quote(start, end);
|
||||||
}
|
}
|
||||||
|
if (";".Contains(start.value)) {
|
||||||
|
return parse_comment(start, end);
|
||||||
|
}
|
||||||
Debug.Assert(end != null);
|
Debug.Assert(end != null);
|
||||||
IList<Expression> expressions = new List<Expression>();
|
IList<Expression> expressions = new List<Expression>();
|
||||||
while (_sts.Available() > 0) {
|
while (_sts.Available() > 0) {
|
||||||
|
@ -61,6 +77,13 @@ namespace Jellyfin.Plugin.SmartPlaylist.Lisp.Compiler {
|
||||||
_sts.Commit();
|
_sts.Commit();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (t is SpaceToken) {
|
||||||
|
// need this here because those tokens can never
|
||||||
|
// return an expression and trying to parse the last
|
||||||
|
// expression will not work if its only spaces and a
|
||||||
|
// closing parentheses.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
_sts.Rewind(1);
|
_sts.Rewind(1);
|
||||||
expressions.Add(parse());
|
expressions.Add(parse());
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,7 @@ namespace Jellyfin.Plugin.SmartPlaylist.Lisp.Compiler {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
char t = program.Get();
|
char t = program.Get();
|
||||||
if ("()\"'".Contains(t)) {
|
if ("()\"';".Contains(t)) {
|
||||||
return new GroupingToken(t.ToString());
|
return new GroupingToken(t.ToString());
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -55,6 +55,8 @@ namespace Jellyfin.Plugin.SmartPlaylist.Lisp.Compiler {
|
||||||
return null;
|
return null;
|
||||||
} else if (_value == "'") {
|
} else if (_value == "'") {
|
||||||
return null;
|
return null;
|
||||||
|
} else if (_value == ";") {
|
||||||
|
return new GroupingToken("\n");
|
||||||
}
|
}
|
||||||
return new GroupingToken(_value);
|
return new GroupingToken(_value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,6 +76,16 @@ namespace Tests
|
||||||
sts = StringTokenStream.generate(program);
|
sts = StringTokenStream.generate(program);
|
||||||
p = new Parser(sts);
|
p = new Parser(sts);
|
||||||
Assert.Equal(program, string.Format("{0}", p.parse()));
|
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]
|
[Fact]
|
||||||
|
|
Loading…
Reference in a new issue