繁体   English   中英

Github的Java语法,用于ANTLR4和C#目标

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM