java - 在表达式的自定义解析器中结合 Java 解析器

标签 java parsing dsl javacc javaparser

我正在尝试创建一种自定义域特定语言,用于使用 java 表达式语句创建 HTML 模板。

例如,它应该解析结合 java 语句的标签:

<div>
    if (someValue == true) {

        <span>"someValue was true"</span>

    }
</div>

现在我知道如何编写这样的解析器了。但是,如果我可以只对表达式使用标准的 Java 解析器,那将会简单得多,这样我就不必重新实现 Java 解析器的一部分。我想要实现的目标可能如下所示:

IfStatementNode parseIfStatement() {

    scanner.expect("if");

    scanner.expect("(");

    JavaExpression expression = scanner.parseJavaExpression(); // <--- how to implement this?

    scanner.expect(")");

    return new IfStatementNode(expression);
}

如何才能让 scanner.parseJavaExpression 解析任何 Java 表达式?

最佳答案

一个选项是添加一些生成代码以将表达式转换为 Function 对象的有效 Java 代码。然后,您可以使用运行时可用的常规 Java 编译器解析生成的函数(包含返回值的表达式)。

这仍然需要您能够找到表达式的结尾。 StreamTokenizer 可能就足够/方便了。

另一个问题是在/如果您添加对变量的支持时跟踪变量。

另一种方法可能是扩展模板中不是 Java 的部分(例如,将 <span> 变成 output.append("<span>") ),将您的模板变成有效的 Java 代码,这些代码可以作为一个整体进行编译。

关于java - 在表达式的自定义解析器中结合 Java 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42607524/

相关文章:

java - 你如何在Java中实现AKS测试来判断一个数字是否是素数?

java - Spring MVC : Several ViewResolvers

c# - 在 .NET 中解析 XML 文件

java - 为什么我的日期时间解析尝试失败?

java - Jackson继承——使用@JsonProperty解析子类中的嵌套JSON

c# - 如何将 ISO8601 TimeSpan 转换为 C# TimeSpan?

python - Python 中的微型 DSL 实现

spring - ref() 没有在 grails 上使用 spring dsl 获取嵌套映射值的 bean 配置

dsl - 寻找好的服务器端语言,允许玩家上传可以执行的代码

java - PostgreSQL JDBC - 可以删除但不能重新创建索引