/test/parser/test_parser.e

http://github.com/tybor/Liberty · Specman e · 156 lines · 136 code · 15 blank · 5 comment · 4 complexity · 086f651094bf6067ad0da58f5ccd2054 MD5 · raw file

  1. class TEST_PARSER
  2. insert
  3. EIFFELTEST_TOOLS
  4. create {}
  5. make
  6. feature {}
  7. make is
  8. do
  9. --parse_code(create {REGULAR_FILE}.make("../../src/lib/kernel/tuple.e"))
  10. --die_with_code(0)
  11. parse_all(create {DIRECTORY}.scan("../../src"))
  12. parse_all(create {DIRECTORY}.scan("."))
  13. end
  14. parse_all (a_directory: DIRECTORY) is
  15. require
  16. a_directory /= Void
  17. local
  18. dir: DIRECTORY; file: FILE; regular: REGULAR_FILE
  19. i: INTEGER
  20. do
  21. label_assert(a_directory.path.out, a_directory.exists)
  22. from
  23. i := a_directory.lower
  24. until
  25. i > a_directory.upper
  26. loop
  27. file := a_directory.file_at(i)
  28. if file.is_regular and then file.name.has_suffix(once ".e") then
  29. regular ::= file
  30. parse_code(regular)
  31. else
  32. inspect
  33. file.name.out
  34. when "eiffeltest", ".svn", "CVS", ".git", ".", ".." then
  35. -- ignored
  36. when "broken", "wrappers" then
  37. -- ignored
  38. else
  39. if file.is_directory then
  40. dir ::= file
  41. parse_all(dir)
  42. else
  43. -- ignored
  44. end
  45. end
  46. end
  47. i := i + 1
  48. end
  49. end
  50. read_code (file: REGULAR_FILE) is
  51. local
  52. in: INPUT_STREAM
  53. do
  54. code.clear_count
  55. in := file.read
  56. from
  57. in.read_line
  58. until
  59. in.end_of_input
  60. loop
  61. code.append(in.last_string)
  62. code.extend('%N')
  63. in.read_line
  64. end
  65. code.append(in.last_string)
  66. in.disconnect
  67. end
  68. generate_not_connected (filename: STRING): STRING is
  69. do
  70. Result := "Could not connect to " + filename
  71. end
  72. parse_code (file: REGULAR_FILE) is
  73. do
  74. std_output.put_line(once "Parsing " + file.path)
  75. read_code(file)
  76. buffer.initialize_with(code)
  77. eiffel.reset
  78. if file.name.out.is_equal(once "tuple.e") then
  79. parser.eval(buffer, eiffel.table, once "Classes")
  80. else
  81. parser.eval(buffer, eiffel.table, once "Class")
  82. end
  83. message_assert(agent generate_syntax_error(file), parser.error = Void)
  84. generated.clear
  85. eiffel.generate(generated)
  86. message_assert(agent generate_generated_error(file), code.is_equal(generated.to_string))
  87. end
  88. generate_generated_error (file: REGULAR_FILE): STRING is
  89. local
  90. tfw: TEXT_FILE_WRITE
  91. do
  92. create tfw.connect_to(file.name.out)
  93. tfw.put_string(code)
  94. tfw.disconnect
  95. tfw.connect_to(file.name.out + ".gen")
  96. tfw.put_string(generated.to_string)
  97. tfw.disconnect
  98. Result := "Bad generation from " + file.path.out + "%N> diff " + file.name.out + " " + file.name.out + ".gen%N"
  99. end
  100. generate_syntax_error (file: REGULAR_FILE): STRING is
  101. local
  102. line, column, index: INTEGER
  103. do
  104. from
  105. index := 1
  106. line := 1
  107. column := 1
  108. until
  109. index = parser.error.index
  110. loop
  111. if code.item(index) = '%N' then
  112. line := line + 1
  113. column := 1
  114. else
  115. column := column + 1
  116. end
  117. index := index + 1
  118. end
  119. Result := "Syntax error in " + file.path + ", line " + line.out + ", column " + column.out + ":%N" + parser.error.message
  120. end
  121. code: STRING is
  122. once
  123. create Result.make(0)
  124. end
  125. generated: STRING_OUTPUT_STREAM is
  126. once
  127. create Result.make
  128. end
  129. buffer: MINI_PARSER_BUFFER is
  130. once
  131. create Result
  132. end
  133. parser: DESCENDING_PARSER is
  134. once
  135. create Result.make
  136. end
  137. eiffel: EIFFEL_GRAMMAR is
  138. once
  139. create Result.make(create {LIBERTY_NODE_FACTORY}.make)
  140. end
  141. end