我希望在由javaCC生成的解析器中实现规则编码:
语句中是否使用了全局变量?
规则生产javacc是:
TOKEN :
{
< ID : ([ "a"-"z"])* >
}
void myProgram() #programm: {}
{
initialisation()
MyMethod ()
{return jjtThis;}
}
void MyMethod () #MyMethod : {}
{
<begin> <id> "(" (Argument ())* ")" {}
(Statement ()) *
<end>
}
void Argument() : {}
{
<String> <id>
<int> <id>
}
void statement () : {}
{
DeclarationVariable()
......
}
void initialisation() : {}
{
DeclarationVariable()
}
void DeclarationVariable() : {}
{
StringDeclarationVariable()
}
void StringDeclarationVariable() :{}
{
<STRING> <id> ["=" StringStructure()]
}
void StringStructure() : {}
{
CallMyMethod ()
VarariableString ()
}
void VarariableString () : {}
{<ID>
}
void CallMyMethod () : {}
{
<id> "(" (
ExpressionTreeStructure ()
(
"," ExpressionTreeStructure ()
) *
) *
")"
}
void ExpressionTreeStructure () {}
{
......
}我的问题是如何验证语句中是否使用了全局变量?提前谢谢你。
发布于 2015-07-18 18:16:43
解决此类问题的通常方法是创建一个符号表,该表记录程序中每个命名实体的信息。命名实体包括变量、函数、类型等。在任何关于编译器的好书中,您都可以(而且应该)阅读有关符号表的内容。
符号表为程序中的每个点提供了从名称到实体信息的映射。
符号表通常是在早期传递时生成的。这可能是解析传递,也可能是在解析之后遍历AST的pass。一旦生成,符号表可以用于查找有关名称所引用的实体的信息。也就是说,当语言处理器看到一个名称时,它会在符号表中查找有关该名称的信息。
如果语言是一种“使用前的定义”语言--C是一个例子--那么符号表可以用于在与它内置的相同的pass中查找;这样就可以解析、构建符号表,并使用符号表进行一次查找。其他语言(例如Java)允许在定义实体之前(在程序文本中)使用实体。在这种情况下,符号表仅用于在生成后的通行证中查找。
在你的例子中--即使你不是在写编译器--你会想要一个符号表。无论何时定义全局变量,都要向符号表中添加一个条目。每当使用变量时,请在符号表中查找该变量,并记下使用该变量的事实。您还需要在符号表中记录局部变量,如下面的示例(C)所示。
int x ; // Add x as a global variable to the symbol table.
int y ; // Add y as a global variable to the symbol table.
void f() {
int x ; // Add x as a local variable to the symbol table.
x = 1 ; // Look up x. Find the local entry. Note that it is used.
y = 1 ; // Look up y. Fund the global entry. Note that it is used.
}https://stackoverflow.com/questions/31451906
复制相似问题