Closed kohei-noda-qcrg closed 1 year ago
シクロヘキサン (CH2)6 みたいな記法はサポートしたほうが(そもそも示性式はそういう記法だし) メリットが大きいかもしれない
正規表現的には [a-zA-Z0-9()] で、カッコの中の原子の数を)の直後の数値でかけるだけでよいので比較的簡単なはず
ネストされた示性式をサポートするには次の2つの方法くらい
後ろから読むと実装にミスが発生しやすそうなので、構文解析を行う方向で。
EBNF (atomだけは並べるのが面倒すぎるので省略) digit_exclude_zero::= '1', '2', '3', '4', '5', '6', '7', '8', '9' digit::= '0' | digit_exclude_zero natural_number ::= digit_exclude_zero, {digit} atom::= 'H' | 'He' | 'Li' | 'Be' | 'B' | 'C' | 'N' | 'O' | 'F' | 'Ne' | ... | 'Rg' atom_number::= atom, natural_number bra::= '(' | '[' | '{' ket::= ')' | ']' | '}' nests ::= bra, { nests | atom_number }, ket, [natural_number] molecule::= nests | { atom_number }
パッケージ化したほうがいいかもと思って pymolecule-parser という名前で作成した
背景
-m, --molオプションについて
例えば酢酸を計算したときに 現時点では C2H4O2 と指定する必要があるが
CH3COOH という書き方をサポートしたほうがいいはず
問題点
① H2C=CHCH2CH3 のようなフォーマットをどうするか 直感的には単に正規表現で[a-zA-Z0-9]のものだけを抜き出してからHが何個あるか、Cが何個あるか...と数え上げればよい?
② UO2_2+ のようなイオンをどう扱うか、フォーマットはどうするか 2+には2という数字があるので、①のように単に正規表現で抜き出してくると、この例だとUO22の計算をしたと勘違いしてしまう 従ってイオンの価数や金属錯体の価数などを-mオプションに書かれるとパースがかなり面倒になる →一旦は価数の表記はユーザー側が書かないと仮定して、示性式をサポートできるか実装してみることにする(オプションの説明などにイオンや価数の数値は書かないように知らせる)