0
4

2 に答える 2

1

プリミティブが欲しいですか?この sed スクリプトは、V7 以降のすべての UNIX で動作するはずです (ただし、非常に古いものではテストしていないので注意してください)。次のように実行しますsed -n -f scriptfile infile > outfile

: loop
/^class [A-Za-z0-9_][A-Za-z0-9_]*(\([A-Za-z0-9_][A-Za-z0-9_]*, *\)*[A-Za-z0-9_][A-Za-z0-9_]*):$/{
h
s/^class \([A-Za-z0-9_][A-Za-z0-9_]*\)(\([A-Za-z0-9_][A-Za-z0-9_]*\)[,)].*/\2 -> \1;/
p
g
s/\(class [A-Za-z0-9_][A-Za-z0-9_]*(\)[A-Za-z0-9_][A-Za-z0-9_]*,* */\1/
b loop
}

これらは BRE (基本正規表現) です。それらには+演算子がなく (これは拡張正規表現にしかありません)、絶対にありません\w(これは perl によって発明されました)。そのため、あなたの単純なもの\w+になり[A-Za-z0-9_][A-Za-z0-9_]*、私はそれを数回使用する必要があり、その結果、大きな醜さが生じました。

疑似コード形式では、次のようになります。

while the line matches /^class \w+(comma-separated-list-of \w+):$/ {
    save the line in the hold space
    capture the outer \w and the first \w in the parentheses
    replace the entire line with the new string "\2 -> \1;" using the captures
    print the line
    retrieve the line from the hold space
    delete the first member of the comma-separated list
}
于 2012-08-18T01:22:26.293 に答える
0

Python のastモジュールを使用して Python を解析するのは、Python と同様に簡単です。

import ast
class ClassDumper(ast.NodeVisitor):
  def visit_ClassDef(self, clazz):
    def expand_name(expr):
      if isinstance(expr, ast.Name):
        return expr.id
      if isinstance(expr, ast.Attribute):
        return '%s.%s' % (expand_name(expr.value), expr.attr)
      return ast.dump(expr)
    for base in clazz.bases:
      print '%s -> %s;' % (clazz.name, expand_name(base))
    ClassDumper.generic_visit(self, clazz)
ClassDumper().visit(ast.parse(open(__file__).read()))

Inner -> Base;(これはの代わりに出力されるため、ネスティングに関しては正しくありませんOuter.Inner -> Base;が、手動ウォークでコンテキストを追跡することで修正できます。)

于 2012-08-18T02:09:06.307 に答える