[英]Java Grammar from Github for ANTLR4 and C# target
我放弃了将C#语法从ANTLR3.2的版本改为ANTLR4的版本,现在我想制作Java Parser和Visitor。 从Github下载的ANTLR4的Java语法: https : //github.com/antlr/grammars-v4/blob/master/java/Java.g4是针对任何目标语言编写的,但是某些代码是针对Java目标编写的,而并非使用C#。 我说的是这些词法规则:
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]
//{char.isJavaIdentifierPart(Character.toCodePoint((char)_input.LA(-2), (char)_input.LA(-1)))}?
;
我已经注释了以{Character.isJavaIdentifier ...}开头的目标代码,现在可以了。 我想知道为什么在那儿!? 我认为,如果之前的标记或之前的2个标记(如果LA(-2))为IdentifierPart,则它返回true,但是操作代码的作用是什么? 在C#中, Char对象不支持静态方法isIdentifierPart或类似的东西。
我的问题是:如果取消操作代码,那么在解析Java输入代码期间,解析器是否会在特定的标识符名称上失败? 如果是,该如何代替C#目标?
感谢您的答复! PK
在Java语言规范§3.8中 ,根据Character
类上的两个静态方法定义了一个标识符 。
Identifier: IdentifierChars but not a Keyword or BooleanLiteral or NullLiteral IdentifierChars: JavaLetter {JavaLetterOrDigit} JavaLetter: any Unicode character that is a "Java letter" JavaLetterOrDigit: any Unicode character that is a "Java letter-or-digit"
“ Java字母”是方法
Character.isJavaIdentifierStart(int)
返回true的Character.isJavaIdentifierStart(int)
。“ Java字母或数字”是一个字符,
Character.isJavaIdentifierPart(int)
方法为其返回true。
语法以特定的方式实现了这一目的,旨在最大限度地提高预期输入的性能。 特别是,来自集合[a-zA-Z0-9_$]
(正则表达式语法)的最著名字符直接由语法处理。 语言规范保证此集合将始终被视为标识符字符。
ANTLR 4不会为U + 007F以上的UTF-16代码单元缓存DFA转换,因此,前面描述的集合之外的所有内容都始终在词法分析器的“慢速”路径上。 这些字符不是使用状态机膨胀,而是使用干净且简单的语义谓词来处理。
如果您的源代码未使用U + 007F上方的代码点作为Unicode标识符,则可以安全地将语法简化为以下内容:
fragment
JavaLetter
: [a-zA-Z$_] // these are the "java letters" below 0xFF
;
fragment
JavaLetterOrDigit
: [a-zA-Z0-9$_] // these are the "java letters or digits" below 0xFF
;
否则,为获得全面支持,您可以使用C#目标中的Java-LR.g4语法(在使用前重命名为Java.g4 )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.