質問する
189 次
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 に答える