我在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'的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)
答案 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
}
}