シンプルな言語パーサー
REのような非常にシンプルなパーサーを構築でき\d+|\w+|".*?"|\n|\S
ます。一致する必要があるトークンは、RE「または」文字で区切られます。
REエンジンは、テキストの現在の位置で一致を試みるたびに、最初のパターン、2番目のパターンなどを試行します。失敗した場合(たとえば、スペース文字で)、先に進み、一致を再試行します。順序が重要です。\S
用語の前に\d+
用語を配置する\S
と、パーサーが破損するスペース以外の文字で最初に一致します。
".*?"
我々は一度に1つの文字列に一致するように文字列マッチャは、非欲張り修飾子を使用しています。REに貪欲でない関数がない場合"[^"]*"
は、同等の関数を使用できます
。
Pythonの例:
text = 'd="dogfinder"\nx=sum(ord(c)*872 for c in "fish"+d[3:])'
pat = r'\d+|\w+|".*?"|\n|\S'
print re.findall(pat, text)
['d', '=', '"dogfinder"', '\n', 'x', '=', 'sum', '(', 'ord', '(', 'c', ')',
'*', '872', 'for', 'c', 'in', '"fish"', '+', 'd', '[', '3', ':', ']', ')']
ゴルフのPythonの例:
# assume we have language text in A, and a token processing function P
map(P,findall(r'\d+|\w+|".*?"|\n|\S',A))
一致する必要がある言語のパターンとその順序を調整できます。この手法は、JSON、基本的なHTML、および数値式に適しています。Python 2で何度も使用されていますが、他の環境で動作するのに十分な汎用性が必要です。