Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
“A ::= aAa / a” in PEGMasaki Haraさっき考えてたことのメモ
PEG• 手前から順番に試す• 文字列の一部分と一致したらそこで停止
PEG• 手前から順番に試す• 文字列の一部分と一致したらそこで停止• 病的な例が知られている
PEGの病的な例• “a := aAa / a” というルールを考える
PEGの病的な例• “a := aAa / a” というルールを考える– 直感的にはaが奇数個並んだ文字列にマッチ
PEGの病的な例• “a := aAa / a” というルールを考える– 直感的にはaが奇数個並んだ文字列にマッチ– 実際はaが(2^n-1)個並んだ文字列にマッチ
PEGの病的な例の解析• ここでは、文字列の後ろ側から順番に解析してみる– 実際は手前から再帰的に試す
a a a a a a aA ::= aAa| a
a a a a a a aA ::= aAa| a×aAaを試そうとするが失敗
a a a a a a aA ::= aAa| a○aを試す→成功
a a a a a a aA ::= aAa| a
a a a a a a aA ::= aAa| a
a a a a a a aA ::= aAa| a×
a a a a a a aA ::= aAa| a○aにマッチ
a a a a a a aA ::= aAa| a
a a a a a a aA ::= aAa| a
a a a a a a aA ::= aAa| a
a a a a a a aA ::= aAa| a○aAaにマッチ
a a a a a a aA ::= aAa| aaAaにマッチしてしまったのでaにはマッチしない
a a a a a a aA ::= aAa| aA=aaaと決まっているのでaaaaaにマッチしようとする→失敗
a a a a a a aA ::= aAa| a×
a a a a a a aA ::= aAa| a○
a a a a a a aA ::= aAa| a
a a a a a a aA ::= aAa| a
a a a a a a aA ::= aAa| a
a a a a a a aA ::= aAa| a○
a a a a a a aA ::= aAa| aaaaにマッチ→全体にマッチしない(∴5文字は×)
a a a a a a aA ::= aAa| a
a a a a a a aA ::= aAa| a7文字は○
a a a a a a aA ::= aAa| a01234567
位置 マッチ先1 02 13 04 35 26 17 0
位置 マッチ先1 02 13 04 35 26 17 0aAaにマッチする時→数字が1減る
位置 マッチ先1 02 13 04 35 26 17 0aにマッチする時→直後を参照
結論• (2^n-1)個のaにマッチすることがわかった
Nächste SlideShare
Wird geladen in …5
×

“A ::= aAa / a” in PEG

1.442 Aufrufe

Veröffentlicht am

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

Veröffentlicht in: Technologie, Gesundheit & Medizin, Business
  • Login to see the comments

“A ::= aAa / a” in PEG

  1. 1. “A ::= aAa / a” in PEGMasaki Haraさっき考えてたことのメモ
  2. 2. PEG• 手前から順番に試す• 文字列の一部分と一致したらそこで停止
  3. 3. PEG• 手前から順番に試す• 文字列の一部分と一致したらそこで停止• 病的な例が知られている
  4. 4. PEGの病的な例• “a := aAa / a” というルールを考える
  5. 5. PEGの病的な例• “a := aAa / a” というルールを考える– 直感的にはaが奇数個並んだ文字列にマッチ
  6. 6. PEGの病的な例• “a := aAa / a” というルールを考える– 直感的にはaが奇数個並んだ文字列にマッチ– 実際はaが(2^n-1)個並んだ文字列にマッチ
  7. 7. PEGの病的な例の解析• ここでは、文字列の後ろ側から順番に解析してみる– 実際は手前から再帰的に試す
  8. 8. a a a a a a aA ::= aAa| a
  9. 9. a a a a a a aA ::= aAa| a×aAaを試そうとするが失敗
  10. 10. a a a a a a aA ::= aAa| a○aを試す→成功
  11. 11. a a a a a a aA ::= aAa| a
  12. 12. a a a a a a aA ::= aAa| a
  13. 13. a a a a a a aA ::= aAa| a×
  14. 14. a a a a a a aA ::= aAa| a○aにマッチ
  15. 15. a a a a a a aA ::= aAa| a
  16. 16. a a a a a a aA ::= aAa| a
  17. 17. a a a a a a aA ::= aAa| a
  18. 18. a a a a a a aA ::= aAa| a○aAaにマッチ
  19. 19. a a a a a a aA ::= aAa| aaAaにマッチしてしまったのでaにはマッチしない
  20. 20. a a a a a a aA ::= aAa| aA=aaaと決まっているのでaaaaaにマッチしようとする→失敗
  21. 21. a a a a a a aA ::= aAa| a×
  22. 22. a a a a a a aA ::= aAa| a○
  23. 23. a a a a a a aA ::= aAa| a
  24. 24. a a a a a a aA ::= aAa| a
  25. 25. a a a a a a aA ::= aAa| a
  26. 26. a a a a a a aA ::= aAa| a○
  27. 27. a a a a a a aA ::= aAa| aaaaにマッチ→全体にマッチしない(∴5文字は×)
  28. 28. a a a a a a aA ::= aAa| a
  29. 29. a a a a a a aA ::= aAa| a7文字は○
  30. 30. a a a a a a aA ::= aAa| a01234567
  31. 31. 位置 マッチ先1 02 13 04 35 26 17 0
  32. 32. 位置 マッチ先1 02 13 04 35 26 17 0aAaにマッチする時→数字が1減る
  33. 33. 位置 マッチ先1 02 13 04 35 26 17 0aにマッチする時→直後を参照
  34. 34. 結論• (2^n-1)個のaにマッチすることがわかった

×