ANTLR中的一些语法问题

时间:2011-06-26 23:42:37

标签: c# antlr

我一直在做一个包含从文本文件中读取的例外情况,并且:

  • 仅用一个空格替换连续的空格/制表符
  • 仅用一个
  • 替换连续的换行符
  • 将所有文字设为大写。

当我执行它时,它不会向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);

1 个答案:

答案 0 :(得分:2)

片段规则只能用于解析器规则中的其他词法分析器规则 not ,正如您尝试的那样。只需从3个词法规则中删除fragment个关键字。

此外,该片段:

$text = " ";

转换为以下(伪代码):

getText() = " "

无效(至少在使用Java目标时无效)。您可能想尝试:

Spaces     :   (' '|'\t')+ { SetText(" "); };

代替。但是CSharp3目标可能只是接受它。