Compiler construction 对特定于域的语言执行静态分析

Compiler construction 对特定于域的语言执行静态分析,compiler-construction,graph,dsl,Compiler Construction,Graph,Dsl,我有一种特定于领域的语言,我想对该语言进行静态分析,以创建一个出色的图形。如果有人能就此提出行动计划,我将不胜感激 域语言 { run_and_branch(ULSDCompHash) then { run(DownComponent_Reset); run(DownComponent_Reset2); } else { run(ULSD_EndOfTest); } run(ULSD_EndOfTest2);

我有一种特定于领域的语言,我想对该语言进行静态分析,以创建一个出色的图形。如果有人能就此提出行动计划,我将不胜感激

域语言

{
   run_and_branch(ULSDCompHash)
   then
   {
      run(DownComponent_Reset);
      run(DownComponent_Reset2);

   }
   else
   {
      run(ULSD_EndOfTest);
   }
   run(ULSD_EndOfTest2);


}, closed,"EMCSETUP",""
语言的详细信息

{
   run_and_branch(ULSDCompHash)
   then
   {
      run(DownComponent_Reset);
      run(DownComponent_Reset2);

   }
   else
   {
      run(ULSD_EndOfTest);
   }
   run(ULSD_EndOfTest2);


}, closed,"EMCSETUP",""
  • 运行不关心条件是否通过或失败
  • run_和_分支就像if-else,if-pass或fail之类的东西
  • ()中的值是节点的名称
预期输出(如果在图形上运行DFS)


大多数编译器书籍都包含关于如何生成控制流图的非常详细的描述


我为Java程序提供了一个示例,但答案相当笼统。

您希望创建哪种图形?控制流图?它是纯文本表示的产物,还是两个代码路径中发生的事情真的应该有单独的节点?我觉得一个控制流图是合适的,这样我就可以进行DFS遍历以获得所有可能的路径。图形应模拟纯文本表示。因此,在我的示例中,将有一个单节点ULSDComponent\u Reset的一个out edge和ULSD\u EndOfteStat的另一个out edge。在进行更多的谷歌搜索之后,第一步是为源代码创建AST树,然后将其转换为控制流图。我找不到任何好的源代码,比如关于如何将AST转换为CFGThanks的逐步解释。我去看看