Antlr4(CSharp目标),语法= Java.g4:生成的JavaLexer.cs不编译

时间:2014-07-18 18:49:50

标签: c# visual-studio-2012 antlr4

我在Visual Studio 2012,.Net 4.5中使用Antlr4cs-4.3.0。我已经成功生成并运用了一个由简单语法(calculator.g4)生成的解析器,因此我觉得我在Visual Studio中正确设置了一些东西。我现在正在尝试为从github.com/antlr/grammars-v4/java获得的Java.g4语法生成一个解析器。生成的JavaLexer.cs文件无法编译(请参阅下面的代码和错误) - 因为它包含对仅存在于java环境中的事物的引用。

任何建议都将不胜感激。

罗伯特

private bool JavaLetterOrDigit_sempred(RuleContext _localctx, int predIndex) {
    switch (predIndex) {
        case 2: return Character.isJavaIdentifierPart(_input.LA(-1));
        case 3: return Character.isJavaIdentifierPart(Character.toCodePoint((char)_input.LA(-2),
                                                      (char)_input.LA(-1)));
    }
    return true;
}

错误:名称'字符'在当前上下文中不存在

错误:' Antlr4.Runtime.ICharStream'不包含' LA'的定义没有推广方法' LA'接受类型' Antlr4.Runtime.ICharStream'的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)

2 个答案:

答案 0 :(得分:1)

该语法包含Java代码。它仅用于以下规则:

fragment
JavaLetter
    :   [a-zA-Z$_] // these are the "java letters" below 0xFF
    |   // covers all characters above 0xFF which are not a surrogate
        ~[\u0000-\u00FF\uD800-\uDBFF]
        {Character.isJavaIdentifierStart(_input.LA(-1))}?
    |   // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
        [\uD800-\uDBFF] [\uDC00-\uDFFF]
        {Character.isJavaIdentifierStart(Character.toCodePoint((char)_input.LA(-2), (char)_input.LA(-1)))}?
    ;

fragment
JavaLetterOrDigit
    :   [a-zA-Z0-9$_] // these are the "java letters or digits" below 0xFF
    |   // covers all characters above 0xFF which are not a surrogate
        ~[\u0000-\u00FF\uD800-\uDBFF]
        {Character.isJavaIdentifierPart(_input.LA(-1))}?
    |   // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
        [\uD800-\uDBFF] [\uDC00-\uDFFF]
        {Character.isJavaIdentifierPart(Character.toCodePoint((char)_input.LA(-2), (char)_input.LA(-1)))}?
    ;

从中删除{...}部分:

fragment
JavaLetter
    :   [a-zA-Z$_] // these are the "java letters" below 0xFF
    |   // covers all characters above 0xFF which are not a surrogate
        ~[\u0000-\u00FF\uD800-\uDBFF]
    |   // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
        [\uD800-\uDBFF] [\uDC00-\uDFFF]
    ;

fragment
JavaLetterOrDigit
    :   [a-zA-Z0-9$_] // these are the "java letters or digits" below 0xFF
    |   // covers all characters above 0xFF which are not a surrogate
        ~[\u0000-\u00FF\uD800-\uDBFF]
    |   // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
        [\uD800-\uDBFF] [\uDC00-\uDFFF]
    ;

和(可选)在稍后阶段执行这些检查,或者用C#代码替换Java代码。

答案 1 :(得分:0)

这是添加的静态类Character如何使用的Java代码也是有效的C#代码。

public static class Character
{
    public static bool isJavaIdentifierPart(int c)
    {
        // some code here
    }

    public static int LA(this Antlr4.Runtime.ICharStream cs, int la)
    {
        return cs.La(la);
    }

    public static int toCodePoint(char c)
    {
         // some code here
    }
}