我使用的是bychan库,这个问题主要围绕着它。
我刚刚查看了minilang示例并阅读了代码。当我看到StatementNode
时,我正在努力寻找一种方法来为常规目的添加结尾分号。在该示例中,;
用于分隔语句,但是没有结束脚本的方式,最后一个语句以;
结尾,因为解析器不能解析结束并导致:
'Premature end reached' @ position ..., current lexeme is END ...
有没有办法检查下一个令牌是END
还是我认为不正确的事情,展望未来是不是正确的事情,还有其他方法吗?
我之前尝试过parser.nextIs(EndToken.get())
,但IDE只是说no instance(s) of type variable(s) N exist so that EndToken<N> conforms to TokenKey
我可能不会在Java中取得进展以找出解决方案。 :(
答案 0 :(得分:0)
这是一个遗漏。核心解析器PrattParser
具有peek()
函数以获取下一个令牌,您可以将其与任何令牌类型进行比较。您可以将其用作peek().getToken().equals(EndToken.get())
。
动态包的解析器接口UserParserCallback
具有另一个用于同一事物的接口:nextIs(TokenKey)
。我们的想法是创建一个比javas builtin equals
更多的类型安全的平等检查。相等类型称为TokenKey
。
现在您遇到了静态令牌(例如EndToken
)没有任何TokenKey
的问题。问题37的修复解决了这个问题。
现在你可以致电parser.nextIs(EndToken.get().getKey())
。有关示例,请参阅ReadmeExamples::statements。
`