0

我开始学习如何在 Visual Studio 中使用 antlr,但我无法获得一个基本的示例!

这是我正在使用的语法:

grammar T;

options {
    language=CSharp3;
    TokenLabelType=CommonToken;
}
@lexer::namespace {CoolTool.CoolProject.Compiler} 
@parser::namespace {CoolTool.CoolProject.Compiler}

/*
 * Parser Rules
 */

compileUnit
    : 'a' AFTER
    ;


AFTER
    :    'after'
    ;

WS
    : (' '|'\r'|'\t'|'\u000C'|'\n');

这是实例化词法分析器和语法的 C# 代码

using System;
using Antlr.Runtime;
namespace CoolTool.CoolProject.Compiler
partial class TParser
    {
        public static void Main(String[] args)
        {
            TLexer lexer = new TLexer(new ANTLRStringStream("$$%$%"));
            CommonTokenStream tokens = new CommonTokenStream(lexer);
            TParser parser = new TParser(tokens);

            parser.compileUnit();

            Console.WriteLine("OK");

        }
    }
}

问题是,无论我将什么传递给词法分析器/解析器,我都不会收到任何错误。我很困惑为什么我没有得到“$$”的 NoViableAltException?

任何人都可以帮忙吗?

谢谢,阿米尔

4

2 回答 2

0

我使用 antlr3.4,并处理如下异常:

        ICharStream input = new ANTLRStringStream(_expressionString);
        ExpressionLexer lex = new ExpressionLexer(input);

        CommonTokenStream tokens = new CommonTokenStream(lex);
        ExpressionParser parser = new ExpressionParser(tokens);
        AstParserRuleReturnScope<CommonTree, CommonToken> r = parser.expression();

        if (lex.HasError)
        {
            throw new ExpressionException(lex.ErrorMessage);
        }
        if (parser.HasError)
        {
            throw new ExpressionException(parser.ErrorMessage);
        }

你的 antlr 版本有点旧,但我认为异常可能相同

于 2012-05-24T16:00:29.350 回答
0

如果我没记错的话,C# 生成的源代码在某些情况下会吞下生成的错误,您需要查询返回的对象以查看是否发生错误。

有些错误你甚至可能需要添加一些额外的代码来捕获。

2 年前我在使用 Antlr 时遇到了类似的问题。

我会检查是否可以找到任何旧代码。

于 2012-05-15T09:59:38.347 回答