使用 C# 的 ANTLR 忽略最后一行
Last line ignored using ANTLR for C#
我们使用 ANTLR 的 C# 4.6.4 版来解析我们工具中使用的代码片段。语法类似于IEC61131,类Pascal PLC语言。当有人输入一个片段而忘记了最后一行的分号时,解析器将忽略这一行。我可以做些什么来获得一些反馈?我至少需要给用户一个错误信息。
我已经有一个错误处理程序:
class ErrorListener : IAntlrErrorListener<IToken>
{
public void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
{
_errorLine = offendingSymbol.Line;
_errorColumn = offendingSymbol.Column + 1;
_errorText = "Error on line " + _errorLine + ", column " + _errorColumn;
}
}
我的词法分析器和解析器函数是:
public CommonTokenStream Lex(string stLike)
{
AntlrInputStream input = new AntlrInputStream(stLike);
IEC61131Lexer lexer = new IEC61131Lexer(input);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
return tokenStream;
}
public IParseTree Parse(CommonTokenStream tokenStream)
{
IEC61131Parser parser = new IEC61131Parser(tokenStream);
ErrorListener listener = new ErrorListener();
parser.AddErrorListener((IAntlrErrorListener<IToken>)listener);
return parser.iec_source();
}
他们是这样称呼的:
CommonTokenStream tokenStream = Lex(stLike);
IParseTree tree = Parse(tokenStream);
// If parsing went OK, _errorText will be empty
if (_errorText == "")
{
// Walk the tree to create code
IEC61131PlcVisitor visitor = new IEC61131PlcVisitor(theClass, tokenStream, target);
visitor.Indent = indent;
result = visitor.Visit(tree);
}
else
{
result = "<" + _errorText + ">";
}
当我解析末尾缺少分号的代码片段时,词法分析器为其生成标记,但解析器在最后一个分号处停止。
在 iec_source
规则末尾添加 EOF
标记。
这样解析器就会知道它必须到达输入的结尾,如果在最后一个识别的语句之后没有找到文件结尾,则会发出错误。
我们使用 ANTLR 的 C# 4.6.4 版来解析我们工具中使用的代码片段。语法类似于IEC61131,类Pascal PLC语言。当有人输入一个片段而忘记了最后一行的分号时,解析器将忽略这一行。我可以做些什么来获得一些反馈?我至少需要给用户一个错误信息。
我已经有一个错误处理程序:
class ErrorListener : IAntlrErrorListener<IToken>
{
public void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
{
_errorLine = offendingSymbol.Line;
_errorColumn = offendingSymbol.Column + 1;
_errorText = "Error on line " + _errorLine + ", column " + _errorColumn;
}
}
我的词法分析器和解析器函数是:
public CommonTokenStream Lex(string stLike)
{
AntlrInputStream input = new AntlrInputStream(stLike);
IEC61131Lexer lexer = new IEC61131Lexer(input);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
return tokenStream;
}
public IParseTree Parse(CommonTokenStream tokenStream)
{
IEC61131Parser parser = new IEC61131Parser(tokenStream);
ErrorListener listener = new ErrorListener();
parser.AddErrorListener((IAntlrErrorListener<IToken>)listener);
return parser.iec_source();
}
他们是这样称呼的:
CommonTokenStream tokenStream = Lex(stLike);
IParseTree tree = Parse(tokenStream);
// If parsing went OK, _errorText will be empty
if (_errorText == "")
{
// Walk the tree to create code
IEC61131PlcVisitor visitor = new IEC61131PlcVisitor(theClass, tokenStream, target);
visitor.Indent = indent;
result = visitor.Visit(tree);
}
else
{
result = "<" + _errorText + ">";
}
当我解析末尾缺少分号的代码片段时,词法分析器为其生成标记,但解析器在最后一个分号处停止。
在 iec_source
规则末尾添加 EOF
标记。
这样解析器就会知道它必须到达输入的结尾,如果在最后一个识别的语句之后没有找到文件结尾,则会发出错误。