首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证是否使用了每个全局变量

问验证是否使用了每个全局变量
EN

Stack Overflow用户
提问于 2015-07-16 10:39:35
回答 1查看 297关注 0票数 0

我希望在由javaCC生成的解析器中实现规则编码:

语句中是否使用了全局变量?

规则生产javacc是:

代码语言:javascript
复制
   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  () {}
        {
        ......
        }

我的问题是如何验证语句中是否使用了全局变量?提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-18 18:16:43

解决此类问题的通常方法是创建一个符号表,该表记录程序中每个命名实体的信息。命名实体包括变量、函数、类型等。在任何关于编译器的好书中,您都可以(而且应该)阅读有关符号表的内容。

符号表为程序中的每个点提供了从名称到实体信息的映射。

符号表通常是在早期传递时生成的。这可能是解析传递,也可能是在解析之后遍历AST的pass。一旦生成,符号表可以用于查找有关名称所引用的实体的信息。也就是说,当语言处理器看到一个名称时,它会在符号表中查找有关该名称的信息。

如果语言是一种“使用前的定义”语言--C是一个例子--那么符号表可以用于在与它内置的相同的pass中查找;这样就可以解析、构建符号表,并使用符号表进行一次查找。其他语言(例如Java)允许在定义实体之前(在程序文本中)使用实体。在这种情况下,符号表仅用于在生成后的通行证中查找。

在你的例子中--即使你不是在写编译器--你会想要一个符号表。无论何时定义全局变量,都要向符号表中添加一个条目。每当使用变量时,请在符号表中查找该变量,并记下使用该变量的事实。您还需要在符号表中记录局部变量,如下面的示例(C)所示。

代码语言:javascript
复制
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.
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31451906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档