Upgrade to Pro — share decks privately, control downloads, hide ads and more …

“A ::= aAa / a” in PEG

“A ::= aAa / a” in PEG

さっき考えてたことのメモ

Ba655e3712aaabfbca289fe136f85fe4?s=128

Masaki Hara

June 09, 2013
Tweet

Transcript

  1. “A ::= aAa / a” in PEG Masaki Hara さっき考えてたことのメモ

  2. PEG • 手前から順番に試す • 文字列の一部分と一致したらそこで停止

  3. PEG • 手前から順番に試す • 文字列の一部分と一致したらそこで停止 • 病的な例が知られている

  4. PEGの病的な例 • “a := aAa / a” というルールを考える

  5. PEGの病的な例 • “a := aAa / a” というルールを考える – 直感的にはaが奇数個並んだ文字列にマッチ

  6. PEGの病的な例 • “a := aAa / a” というルールを考える – 直感的にはaが奇数個並んだ文字列にマッチ

    – 実際はaが(2^n-1)個並んだ文字列にマッチ
  7. PEGの病的な例の解析 • ここでは、文字列の後ろ側から順番に解析し てみる – 実際は手前から再帰的に試す

  8. a a a a a a a A ::= aAa

    | a
  9. a a a a a a a A ::= aAa

    | a × aAaを試そうと するが失敗
  10. a a a a a a a A ::= aAa

    | a ◦ aを試す →成功
  11. a a a a a a a A ::= aAa

    | a
  12. a a a a a a a A ::= aAa

    | a
  13. a a a a a a a A ::= aAa

    | a ×
  14. a a a a a a a A ::= aAa

    | a ◦ aにマッチ
  15. a a a a a a a A ::= aAa

    | a
  16. a a a a a a a A ::= aAa

    | a
  17. a a a a a a a A ::= aAa

    | a
  18. a a a a a a a A ::= aAa

    | a ◦ aAaにマッチ
  19. a a a a a a a A ::= aAa

    | a aAaにマッチしてしまった のでaにはマッチしない
  20. a a a a a a a A ::= aAa

    | a A=aaaと決まっているので aaaaaにマッチしようとする →失敗
  21. a a a a a a a A ::= aAa

    | a ×
  22. a a a a a a a A ::= aAa

    | a ◦
  23. a a a a a a a A ::= aAa

    | a
  24. a a a a a a a A ::= aAa

    | a
  25. a a a a a a a A ::= aAa

    | a
  26. a a a a a a a A ::= aAa

    | a ◦
  27. a a a a a a a A ::= aAa

    | a aaaにマッチ →全体にマッチしない (∴5文字は×)
  28. a a a a a a a A ::= aAa

    | a
  29. a a a a a a a A ::= aAa

    | a 7文字は◦
  30. a a a a a a a A ::= aAa

    | a 0 1 2 3 4 5 6 7
  31. 位置 マッチ先 1 0 2 1 3 0 4 3

    5 2 6 1 7 0
  32. 位置 マッチ先 1 0 2 1 3 0 4 3

    5 2 6 1 7 0 aAaにマッチする時 →数字が1減る
  33. 位置 マッチ先 1 0 2 1 3 0 4 3

    5 2 6 1 7 0 aにマッチする時 →直後を参照
  34. 結論 • (2^n-1)個のaにマッチすることがわかった