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