2017-10-28 6 views
0

私は最初のPythonプログラムを書こうとしています - ソースファイル(javascript)を解析し、ある種の相互参照レポートを作成するプログラムです。どのようにして私のデータをPythonで表現できますか?

私はすべてのVARSと機能のために、以下の情報を保存する:

  • 変数名
  • タイプ(VARまたは機能)
  • ライン
  • 範囲を宣言 - 名前にこれを組み込むことができますフィールド - 例えばメイン::
  • MYVAR初期値
  • ライン(複数可)
  • を変更されたライン(S)

を参照される各変数は一度だけ宣言されていることを保証するものではありません。 (私はいくつかの掃除をしています)

誰も入力ファイルを横断して詳細を保存する方法をお勧めしますか?

私のOSは10勝で、私はあなたが長い旅を始めているようですね3.6

+3

これまでに何を試しましたか?私たちはあなたのためにコードを書くつもりはありません。あなたのコードの問題を解決し、あなたの質問に答えるためにここに来ました。 – HyperNeutrino

+0

「最初のPythonプログラムとしてコンパイラを書くつもりです」とほとんど気付かなかったかもしれません(それは複雑で挑戦的な作業なので、これはお勧めできません)。長い旅 ")。特定の「詳細を保存する方法」については、ツリーは通常ネストされた構造を表現することができ、検索/トラバーサルに効率的です(ツリーに読み込みトークンを入れて、願い) – progmatico

答えて

0

を使用しています。ソースコードファイルを解析するには、まずそれをトークン化する必要があります。ここでは、簡単な算術式をトークン化して開始する関数を示します。

OPERATORS = '+', '-', '*', '/' 

def tokenize(expression): 
    def state_none(c): 
     if c.isdecimal(): 
      self.token = c 
      self.state = state_number 
     elif c in OPERATORS: 
      self.token = 'operator', c 
      self.token_ready = True 

    def state_number(c): 
     if c.isdecimal(): 
      self.token += c 
     else: 
      self.char_consumed = False 
      self.token = 'number', self.token 
      self.token_ready = True 
      self.state = state_none 

    def interpret_character(c): 
     self.token_ready = False 
     self.char_consumed = True 
     self.state(c) 

    class self: 
     token_ready = False 
     token = None 
     char_consumed = True 
     state = state_none 

    for c in expression: 
     self.char_consumed = False 
     while not self.char_consumed: 
      interpret_character(c) 
      if self.token_ready: 
       yield self.token 
    if self.state == state_number: 
     yield 'number', self.token 

def main(): 
    for x in tokenize('15+ 2 * 378/5'): 
     print(x) 

    # ('number', '15') 
    # ('operator', '+') 
    # ('number', '2') 
    # ('operator', '*') 
    # ('number', '378') 
    # ('operator', '/') 
    # ('number', '5') 

if __name__ == "__main__": 
    main() 

しかし、実際に、あなたの手を汚す:、ファイルを開き、いくつかのコードを記述した文字を繰り返し処理、および彼らと何か(トークンのグループにそれらを)行います。

+0

あなたの返信をありがとう - V2でおそらくニロが提供したコードを取り入れます。 – Markdman

+0

私はコメントを取り除き、実行可能な行を "処理"するためのdefに渡しました。
var SymTF_P2 = Symbol + "、" + TF_P2;私の最初の考えはdictに格納することでしたが、すぐにこのアプローチが行なわれていないことに気づきました。各キーの次のエントリが既存の値を壊すためです。 – Markdman

関連する問題