# limitations under the License.
# Program used to test the NIT parser
-package test_parser
+module test_parser
import parser
+import parser_util
class PrintTreeVisitor
super Visitor
- var _rank: Int
+ private var rank: Int = 0
redef fun visit(n)
do
if n isa Token then
- printn(" " * _rank, n.class_name, " \"", n.text.escape_to_c, "\" ", n.location, "\n")
+ printn(" " * rank, n.class_name, " \"", n.text.escape_to_c, "\" ", n.location, "\n")
else
- printn(" " * _rank, n.class_name, " ", n.location, "\n")
+ printn(" " * rank, n.class_name, " ", n.location, "\n")
end
- _rank = _rank + 1
+ rank = rank + 1
n.visit_all(self)
- _rank = _rank - 1
- end
-
- init
- do
- _rank = 0
+ rank = rank - 1
end
end
var only_lexer = false
var need_help = false
var no_file = false
+var interactive = false
-while not args.is_empty and args.first.first == '-' do
+while not args.is_empty and args.first.chars.first == '-' do
if args.first == "-n" then
no_print = true
else if args.first == "-l" then
only_lexer = false
else if args.first == "-e" then
no_file = true
+ else if args.first == "-i" then
+ interactive = true
else if args.first == "-h" or args.first == "-?" then
need_help = true
else
args.shift
end
-if args.is_empty or need_help then
+if (args.is_empty and not interactive) or need_help then
print("usage:")
print(" test_parser [options]... <filename.nit>...")
+ print(" test_parser -e [options]... <text>...")
+ print(" test_parser -i [options]...")
print("options:")
print(" -n do not print anything")
print(" -l only lexer")
print(" -p lexer and parser (default)")
print(" -e instead on files, each argument is a content to parse")
+ print(" -i tree to parse are read interactively")
print(" -h print this help")
+else if interactive then
+ if only_lexer then
+ print "Error: -l and -i are incompatibles"
+ exit 1
+ else if no_file then
+ print "Error: -e and -i are incompatibles"
+ exit 1
+ else if not args.is_empty then
+ print "Error: -i works without arguments"
+ exit 1
+ end
+
+ var tc = new ToolContext
+
+ loop
+ var n = tc.interactive_parse("-->")
+ if n isa TString then
+ var s = n.text
+ if s == ":q" then
+ break
+ else
+ print "`:q` to quit"
+ end
+ continue
+ end
+
+ if n isa AError then
+ print "{n.location.colored_line("0;31")}: {n.message}"
+ continue
+ end
+
+ if not no_print then
+ (new PrintTreeVisitor).enter_visit(n)
+ end
+ end
else
for a in args do
var source
if no_file then
source = new SourceFile.from_string("", a)
else
- var f = new IFStream.open(a)
+ var f = new FileReader.open(a)
source = new SourceFile(a, f)
f.close
end