C# 使用C的ANTLR忽略最后一行
我们使用ANTLR的C版本4.6.4来解析工具中使用的代码段。该语法类似于IEC61131,即类似Pascal的PLC语言。当有人输入一个代码段并忘记最后一行的分号时,解析器将忽略这一行。我能做些什么来获得一些反馈?我需要至少给用户一个错误消息 我已经有一个错误处理程序:C# 使用C的ANTLR忽略最后一行,c#,antlr,C#,Antlr,我们使用ANTLR的C版本4.6.4来解析工具中使用的代码段。该语法类似于IEC61131,即类似Pascal的PLC语言。当有人输入一个代码段并忘记最后一行的分号时,解析器将忽略这一行。我能做些什么来获得一些反馈?我需要至少给用户一个错误消息 我已经有一个错误处理程序: class ErrorListener : IAntlrErrorListener<IToken> { public void SyntaxError(IRecognizer recognizer, ITo
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;
}
}
我的lexer和parser函数是:
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 + ">";
}
当我解析结尾缺少分号的代码段时,lexer会为它生成标记,但解析器会在最后一个分号处停止
在iec_源规则末尾添加EOF令牌
这样,解析器就会知道它必须到达输入的末尾,如果在最后一个识别的语句之后没有找到文件的末尾,就会发出错误。这正是我所需要的。谢谢!很抱歉我反应迟钝。