ProtoParser.lime 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. %class ProtoParser
  2. %start file
  3. file =
  4. directives messages {
  5. $$ = array(
  6. "directives" => $1,
  7. "messages" => $2
  8. );
  9. }.
  10. directives =
  11. {
  12. $$ = array();
  13. } |
  14. directive semicolon directives {
  15. $$ = array_merge(array($1), $3);
  16. }.
  17. directive =
  18. include string {
  19. $$ = array(
  20. "type" => "include",
  21. "file" => $2
  22. );
  23. }.
  24. messages =
  25. msgspec {
  26. $$ = array($1);
  27. } |
  28. msgspec messages {
  29. $$ = array_merge(array($1), $2);
  30. }.
  31. msgspec =
  32. message name spar entries epar semicolon {
  33. $$ = array(
  34. "name" => $2,
  35. "entries" => $4
  36. );
  37. }.
  38. entries =
  39. entry {
  40. $$ = array($1);
  41. } |
  42. entry entries {
  43. $$ = array_merge(array($1), $2);
  44. }.
  45. entry =
  46. cardinality type name equals number semicolon {
  47. $$ = array(
  48. "cardinality" => $1,
  49. "type" => $2,
  50. "name" => $3,
  51. "id" => $5
  52. );
  53. }.
  54. cardinality =
  55. repeated {
  56. $$ = "repeated";
  57. } |
  58. optional {
  59. $$ = "optional";
  60. } |
  61. required {
  62. $$ = "required";
  63. } |
  64. required repeated {
  65. $$ = "required repeated";
  66. }.
  67. type =
  68. uint {
  69. $$ = array(
  70. "type" => "uint",
  71. "size" => $1
  72. );
  73. } |
  74. data {
  75. $$ = array(
  76. "type" => "data"
  77. );
  78. } |
  79. data srpar string erpar {
  80. $$ = array(
  81. "type" => "constdata",
  82. "size" => $3
  83. );
  84. } |
  85. message name {
  86. $$ = array(
  87. "type" => "message",
  88. "message" => $2
  89. );
  90. }.