使用 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) ; }
}
}
我使用 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) ; }
}
}