0

私は基本的な言語を作っています。まあ、正確ではありませんが、わかります。今、コマンドをエコーし​​て終了しましたが、助けが必要です。

文字列 'echo "hello bob"' を指定すると、それを分割して [echo, Hello Bob] のような配列を指定します。今、エコーが機能していますが、単語は1つだけです。--> 'echo bob' を実行すると、'bob' が出力されます。しかし、「echo hi bob」を実行すると、「hi」が出力されます。そして、私はいつもそれをしたいと思っています。コマンド foo がある場合、'foo "bar face" boo' を実行して [foo, bar face, boo] を取得します。したがって、基本的には、引用符の間を除いて myArr.split(' ') を実行したいと考えています。これどうやってするの?

4

2 に答える 2

4

簡単な答えは次のとおりです。

>>> import shlex
>>> shlex.split('echo "hello bob"')
['echo', 'hello bob']

shlexシェルに似た言語の解析を支援するモジュールです。

ドキュメントはここにあります (JIStone に感謝します): http://docs.python.org/library/shlex.html

于 2012-05-31T22:12:58.500 に答える
1

ここに簡単なトークナイザーがあります

import re

def s_ident(scanner, token): return token
def s_operator(scanner, token): return "op%s" % token
def s_float(scanner, token): return float(token)
def s_int(scanner, token): return int(token)

scanner = re.Scanner([
    (r"[a-zA-Z_]\w*", s_ident),
    (r"\d+\.\d*", s_float),
    (r"\d+", s_int),
    (r"=|\+|-|\*|/", s_operator),
    (r"\s+", None),
    ])

print scanner.scan("sum = 3*foo + 312.50 + bar")

この lex されたコンテンツを実際に使用するには、パーサーが必要です。

于 2012-05-31T22:07:14.297 に答える