使用 JavaCC 为小型编程语言构建解释器

Building an interpreter for a small programming language using JavaCC

我使用 JavaCC 为一种小型编程语言构建了一个词法分析器和一个解析器。编程语言中有效程序的示例是:

DEF MAIN { FUNCTION1(4) };
DEF FUNCTION1 x { x+3 } ;

在上面的示例中,我希望程序输出 7,但为此需要调用 FUNCTION1。我知道我必须在某处存储中间表示才能实现这一点。我如何使用哈希映射来做到这一点?

假设函数的中间表示由 class Function 的对象表示。你可以有一个符号 table 将函数名称(大概由 String 类型的对象表示)映射到 Function 对象。符号 table 可以用哈希映射表示,例如

class SymbolTable extends HashMap<String, Function> { }

您可以在开头创建一个空符号 table,然后在解析时填充它。例如,像这样。

SymbolTable Program(  )
{
    SymbolTable table = new SymbolTable() ;
}
{
    ( FunctionDefinition( table ) )*
    <EOF>
    { return SymbolTable ; }
}

void FunctionDefinition( SymbolTable table )
{
    Function f ;
    String name ;
}
{
    <DEF>
    name = <NAME>
    f = FunctionBody()
    ";"
    {
      if( table.hasKey( name ) { ...do something... } ;
      else { table.add(name, f) ; }
    }
}