AOJ 構文解析
簡単な文字列処理
構文解析器を書いたりする必要がないものたちです. STL の使い方の練習など.
- 0105 Book Index
- 0151 Grid
- 0350 Irreducible Fractionalization
- 1602 ICPC Calculator
- 2369 CatChecker
- 2435 Zero Division Checker
- 逆ポーランド記法は簡単なので.
- 2680 LR
- 分類が難しい.構文解析的な難しさはないはず.
簡単な構文解析
簡単な構文解析器を書く練習です.
Python などの eval
で殴れるレベルです.
簡単な構文解析 2
やること自体は単純ですが,ほんの少し面倒なものたちです. 適宜,構造体などを定義して実装するとよいかもしれません. 構文解析器の返り値は必ずしも整数値である必要はないことを覚えておきましょう.
// {"|", "^", "&", "+-", "*/"} のように,二項演算子を優先度が高くなる順に並べます std::vector<std::string> BIN_OPS = {"+-", "*/%"}; ResultType parse(const std::string& s, size_t& i, size_t p) { if (p == BIN_OPS.size()) { if (s[i] == '(') { res = parse(s, ++i, 0); assert(s[i] == ')'); ++i; } else if (s[i] == '~') { // 前置の単項演算子があれば適当にやります res = ~parse(s, ++i, p); } else if (/* リテラル */) { // 数値なりを適当にパースします } // 後置の単項演算子があれば適当にやります // 適当おわり return res; } ResultType res = parse(s, i, p+1); while (i < s.length()) { bin_op = s[i]; if (bin_op not in BIN_OPS[p]) break; ResultType tmp = parse(s, ++i, p+1); res.op_eq(op, tmp); } return res; }
ここでいう簡単とは,定跡に沿って実装すればそのまま Accept される,程度の意味です.
- 0264 Finite Field Calculator
- 0291 Mystery of an Ancient Ruin
- 1012 Operations with Finite Sets
- 1102 Calculation of Expressions
std::complex<int>
が未規定というのは知っていますか?- 1145 The Genome Database of All Space Life
- 1244 Molecular Formula
- 1314 Matrix Calculator
- ある種のハラスメントで簡単と言っていますが,実際簡単に見えてきます.
- 1346 Miscalculation
- 2255 6/2(1+2)
- 違うことをやる必要があるように見えるかもしれませんが,本質的に同じことをするだけでよいです.
- 2348 Testing Circuits
- やることは簡単ですが,与えられる文字数が大きいです.
- 計算効率のよくない構文解析器を書きがちな人は注意がいるかもしれません.
- 2570 Shipura
- ちょっと難しそう
- 2584 Broken Cipher Generator
- ちょっと傾向が違うといえば違う気もする.
- 2596 Points and Lines
- 幾何かな?
- 2613 Unordered Operators
- これすき.
- 2731 Shifting a Matrix
- グッと睨むと,楽に構文解析できる構造になることがわかります.
一風変わった構文解析
- 1001 Binary Tree Intersection And Union
- 二つの文字列を同時に読み進めます.
- 1188 Hierarchical Democracy
- 二項演算はしないです.
- 2740 Rooted Tree for Misawa-san
- これも二つの文字列を同時に読み進めます.
全探索をする構文解析
与えられた入力に対して代入を行い,パースを何度も行うタイプの問題です.
- 1037 Midnight Teatime
- 1155 How can I satisfy thee? Let me count the ways...
- 2401 Equation
- 2883 Proof of Knowledge
Python で楽をするタイプの構文解析
C++ で頑張ろうとすると面倒そうに見えますが,Python で正規表現 (re
) が使えたりすると殴りやすい問題です.
この手の問題を見極められると嬉しいかもしれません.
- 1078 SAT-EN-3
- 1282 Bug Hunt
- 2438 YAML
- 2523 Time Complexity
- 2845 Star in Parentheses
- 2857 Tournament Chart
- 3002 Factorization
難しめの構文解析
処理すべき文字列が,必ずしも与えられた文法に沿っていない場合,少々つらさが増します. 特に,与えられた文字列に自分で手を加えたものを処理する必要がある場合,バグを埋め込みやすいので注意です(適当に手を加えた文字列が正しい文法に沿っているかきちんと確認をしましょう).
やや面倒な構文解析
構文解析以外に面倒な要素が含まれていて面倒ですが,落ち着いてやれば平気です.
- 1087 Dimensional Analysis
- 1233 Equals are Equals
- 多項式ライブラリが欲しくなりますか?
- それはそれで結構ですが,抜け道を考えてみるのもアリです.
- 1293 Common Polynomial
- 1300 Chemist's Math
- 1620 Boolean Expression Compressor
- 2328 Mobile Network
- Dinic を信じろ
面倒な構文解析
やりたくない.やらないことはないんですが.
面白い構文解析
やりたい.大変かもしれませんが苦痛ではないはずです.
難しい構文解析
知識が必要そうな問題です.天才にとってはそんなことないかもしれません.基本的には区間 DP です.
To-Do
えびちゃんの課題です.
- none