Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Antlr4(CSharp目标),Grammar=Java.g4:生成的JavaLexer.cs不编译_C#_Visual Studio 2012_Antlr4 - Fatal编程技术网

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

C# Antlr4(CSharp目标),Grammar=Java.g4:生成的JavaLexer.cs不编译,c#,visual-studio-2012,antlr4,C#,Visual Studio 2012,Antlr4,我正在Visual Studio 2012、.Net 4.5中使用Antlr4cs-4.3.0。我已经成功地生成并使用了一个由简单语法(calculator.g4)生成的解析器,因此我觉得我已经在VisualStudio中正确地设置了一些东西。我现在正试图为我从中获得的Java.g4语法生成一个解析器。生成的JavaLexer.cs文件不会编译(请参阅下面的代码和错误),因为它包含对仅存在于java环境中的事物的引用 任何建议都将不胜感激 罗伯特 private bool JavaLetterO

我正在Visual Studio 2012、.Net 4.5中使用Antlr4cs-4.3.0。我已经成功地生成并使用了一个由简单语法(calculator.g4)生成的解析器,因此我觉得我已经在VisualStudio中正确地设置了一些东西。我现在正试图为我从中获得的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;
}
错误:名称“Character”在当前上下文中不存在


错误:“Antlr4.Runtime.ICharStream”不包含“LA”的定义,并且找不到接受类型为“antl4.Runtime.ICharStream”的第一个参数的扩展方法“LA”(是否缺少using指令或程序集引用?

语法包含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代码。

这就是添加的静态类
字符
如何使使用的
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
    }
}

或者添加一个静态类
Character
和使Java代码也有效的所用方法C#code…@Onur,看到错误消息“Antlr4.Runtime.ICharStream”不包含“LA”的定义,它不仅仅是
Character
类。您可以为
LA
方法或
Antlr4.Runtime.ICharStream'
instances…@Onur,当然,但我认为使用C#自己的API来执行检查比模仿Java的方法/类名更容易。这取决于具体情况。如果语法经常更新(这里可能不是这样),并且您不必修改文件来使用它,那么这可能是一个好主意。如果它很难模仿并且不经常改变,那么它可能不是。如果您必须支持多个平台,这可能是一个好主意。如果“兼容性”类在默认情况下也包含在C#目标中,那么对于一些人来说,这将使生活变得更轻松,没有太多缺点。谢谢你,Bart和Onur。我参加了奥努尔的性格课。