2015-07-16 4 views
0

Я хочу, чтобы реализовать правила кодирования в моем парсер, генерируемый 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 () {} 
     { 
     ...... 
     } 

мой вопрос, как я могу проверить это глобальная переменная используется в операторе ?. Заранее спасибо.

+0

Сначала неясно, что вы просите. Возможно, вы имеете в виду «использовать», а не «называли». Во-вторых, ваш код для 'Statement1' не является синтаксически корректным JavaCC; это только добавляет к путанице. Наконец, я не думаю, что это вопрос о JavaCC вообще; насколько я могу судить, речь идет о обработке языка, которая находится в нисходящем потоке от разбора и построения дерева. Попробуйте улучшить вопрос и пометьте его соответствующим образом. –

+0

Я хочу знать, используется ли глобальная переменная, поэтому я хочу использовать это правило проверки при разборе, генерируемом JavaCC. Заранее спасибо. – kadahowa

+0

@ Теодор Норвелл, я улучшил вопрос (исправление правил создания javaCC) и, соответственно, тег. Заранее спасибо – kadahowa

ответ

1

Обычный подход к этой проблеме заключается в создании таблицы символов, которая записывает информацию о каждом именованном объекте в вашей программе. Именованные объекты включают такие вещи, как переменные, функции, типы и т. Д. Вы можете (и должны) читать о таблицах символов в любой хорошей книге о компиляторах.

Таблица символов предоставляет для каждой точки программы сопоставление от имен к информации об объектах.

Табличка символов обычно создается во время раннего прохода. Это может быть синтаксический проход, или это может быть пропуск, который проходит по AST после разбора. После построения таблицы символов можно использовать для поиска информации об объектах, на которые ссылаются имена. I.e., когда процессор языка видит имя, он ищет в таблице символов информацию об этом имени.

Если язык является языком «определение перед использованием» - C - пример, то таблица символов может использоваться для поиска в том же самом проходе, в котором он встроен; таким образом, можно проанализировать, построить таблицу символов и использовать таблицу символов для поиска всего за один проход. Другие языки (например, 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. 
} 
+0

@ Теодор Норвелл, я могу добавить запись в таблицу символов следующим образом: 'void StringDeclarationVariable(): {Token token1;} { token1 = [" = "tringStructure()] {ST.put (token1.image, новый НТК (String, token1.image)} } '' – kadahowa

+0

недействительными StringDeclarationVariable(): {Знак token1;} { token1 = [ "=" tringStructure()] {jjtThis.value = tok1.image; ST.put (tok1.image, новый НТК ("String" tok1.image)); }} с ST, как: общественности статической Hashtable ST = новый Hashtable(); и СПУ, как: общественного класс STC расширяет Object { Тип струны; Значение строки; public STC (String itype, String ivalue) { type = itype; value = ivalue; } } ' ma question Как я могу Всякий раз, когда используется переменная, найдите переменную в таблице символов и обратите внимание на то, что она используется. большое спасибо. – kadahowa

+0

проблема решена. Я использовал только парсер, но не АСТ. Спасибо. – kadahowa

Смежные вопросы