我一直在做一个包含从文本文件中读取的例外情况,并且:
当我执行它时,它不会向output.txt
文件写任何内容......
我一直试图找到问题一段时间没有成功。这是我的代码:
grammar Ejerc1;
options
{
language = CSharp3;
}
@header
{
using System.IO;
using System;
}
fragment Spaces : (' '|'\t')+ { $text = " "; };
fragment Any : (~(' '|'\t'|'\n'|'\r'))+ { $text = $text.ToUpper(); };
fragment NewLines : ('\r'|'\n')+ { $text = "\r\n"; };
/* Parser */
public file[string filePath]
@init {
if (File.Exists($filePath)) {
File.Delete($filePath);
}
StreamWriter w = new StreamWriter($filePath);
}
@after {
w.Close();
}
:
(
Spaces { w.Write($Spaces.text); }
|NewLines { w.Write($NewLines.text); }
|Any { w.Write($Any.text); }
)*
EOF;
以下是Main
方法中的代码:
string inputPath = "text.txt";
string outputPath = "output.txt";
var input = new ANTLRFileStream(inputPath);
var lexer = new Ejerc1Lexer(input);
var tokens = new CommonTokenStream(lexer);
var parser = new Ejerc1Parser(tokens);
parser.file(outputPath);
答案 0 :(得分:2)
片段规则只能用于解析器规则中的其他词法分析器规则 not ,正如您尝试的那样。只需从3个词法规则中删除fragment
个关键字。
此外,该片段:
$text = " ";
转换为以下(伪代码):
getText() = " "
无效(至少在使用Java目标时无效)。您可能想尝试:
Spaces : (' '|'\t')+ { SetText(" "); };
代替。但是CSharp3目标可能只是接受它。