相关疑难解决方法(0)

将AST编译回源代码

我目前正在构建一个用PHP编写的PHP解析器,因为在我之前的问题中没有出现现有的解析器.该分析器本身运作得相当好.

现在很明显,解析器本身没什么用(除了静态分析).我想将转换应用于AST,然后将其编译回源代码.应用转换不是一个问题,普通的访客模式应该这样做.

我目前的问题是如何将AST编译回源代码.我看到基本上有两种可能性:

  1. 使用某种预定义方案编译代码
  2. 保留原始代码的格式并仅在已更改的节点上应用1.

现在我想专注于1.因为2.似乎很难完成(但如果你有相关的提示,我想听听它们).

但我不确定哪种设计模式可用于编译代码.我看到实现这一点的最简单方法是->compile向所有节点添加一个方法.我在这里看到的缺点是,更改生成的输出的格式非常困难.人们需要更改节点本身才能做到这一点.因此,我正在寻找一个不同的解决方案.

我听说访客模式也可以用于此,但我无法想象它应该如何工作.据我了解访问者模式,你有一些NodeTraverser在所有节点上递归迭代并调用一个->visit方法Visitor.对于节点操作来说这听起来非常有前景,其中该Visitor->visit方法可以简单地更改它传递的Node,但我不知道它如何用于编译.一个显而易见的想法是将节点树从叶子迭代到根,并用源代码替换访问的节点.但这在某种程度上似乎不是一个非常干净的解决方案?

php compiler-construction abstract-syntax-tree

30
推荐指数
1
解决办法
9053
查看次数

允许空白部分ANTLR4

我有一个antlr4语法,专门用于嵌入到文本模板中的特定于域的语言.

有两种模式:

  • 文本(应保留空格)
  • 代码(应忽略空格)

示例语法部分:

template
  :  '{' templateBody '}'
  ;

templateBody
  : templateChunk*
  ;

templateChunk
  : code # codeChunk // dsl code, ignore whitespace
  | text # textChunk // any text, preserve whitespace
  ;
Run Code Online (Sandbox Code Playgroud)

规则code可以包含对template规则的嵌套引用.因此解析器必须支持嵌套空白/非空白部分.

也许lexer模式可以帮助 - 有一些缺点:

  • 必须在另一个编译器传递中解析代码段
  • 我怀疑嵌套部分是否可以正确映射

然而,最有希望的方法似乎是操纵隐藏的渠道.

我的问题:是否有最佳实践来满足这些要求?是否有一个示例语法,已经解决了类似的问题?

附录:

其余的语法可能如下所示:

code
  : '@' function
  ;

function
  : Identifier '(' argument ')'
  ;

argument
  : function
  | template
  ;

text
  : Whitespace+
  | Identifier
  | .+
  ; …
Run Code Online (Sandbox Code Playgroud)

java antlr antlr4

1
推荐指数
1
解决办法
2465
查看次数