Java 구문 분석을 위해 Antlr 3.5 문법을 사용하는 동안 'IDENTIFIER'규칙은 ANTLR Lexer 문법에서 키워드를 거의 사용하지 않습니다. 또한 "이" 키워드를 소비, 바람직하지 않다 -'IDENTIFIER'규칙도 ANTLR Lexer 문법에서 키워드를 사용합니다.
public final int inch = this.getValue();
그런 규칙 '> 식별자가 VAR_VALUE'내가 선을 구문 분석 할 때 렉서 문법은
lexer grammar JavaLexer;
options {
//k=8;
language=Java;
filter=true;
//backtrack=true;
}
@lexer::header {
package java;
}
@lexer::members {
public ArrayList<String> keywordsList = new ArrayList<String>();
}
V_DECLARATION
:
(((MODIFIERS)=>tok1=MODIFIERS WS+)? tok2=TYPE WS+ var=V_DECLARATOR WS*)
{...};
fragment
V_DECLARATOR
:
(
tok=IDENTIFIER WS* (',' | ';' | ASSIGN WS* V_VALUE)
)
{...};
fragment
V_VALUE
: (IDENTIFIER (DOT WS* IDENTIFIER WS* '(' | ',' | ';'))
;
MODIFIERS
:
(PUBLIC | PRIVATE | FINAL)+
;
PRIVATE
: tok = 'private'
{ keywordsList.add($tok.getText()); }
;
PUBLIC
: tok = 'public'
{ keywordsList.add($tok.getText()); }
;
DOT
: '.'
{ keywordsList.add("."); }
;
THIS
: tok = 'this'
{ keywordsList.add($tok.getText()); }
;
ASSIGN
: '='
{ keywordsList.add("="); }
;
IDENTIFIER:
tok =Identifier
{
//System.out.println("Identifier: " + $tok.text);
}
;
fragment
Identifier
: (Letter (Letter|JavaIDDigit)*);
fragment
Letter
: '\u0024' |
'\u0041'..'\u005a' |
'\u005f' |
'\u0061'..'\u007a' |
'\u00c0'..'\u00d6' |
'\u00d8'..'\u00f6' |
'\u00f8'..'\u00ff' |
'\u0100'..'\u1fff' |
'\u3040'..'\u318f' |
'\u3300'..'\u337f' |
'\u3400'..'\u3d2d' |
'\u4e00'..'\u9fff' |
'\uf900'..'\ufaff'
;
fragment
JavaIDDigit
: '\u0030'..'\u0039' |
'\u0660'..'\u0669' |
'\u06f0'..'\u06f9' |
'\u0966'..'\u096f' |
'\u09e6'..'\u09ef' |
'\u0a66'..'\u0a6f' |
'\u0ae6'..'\u0aef' |
'\u0b66'..'\u0b6f' |
'\u0be7'..'\u0bef' |
'\u0c66'..'\u0c6f' |
'\u0ce6'..'\u0cef' |
'\u0d66'..'\u0d6f' |
'\u0e50'..'\u0e59' |
'\u0ed0'..'\u0ed9' |
'\u1040'..'\u1049'
;
WS : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN; skip();}
;
입니다 키워드는 별도의 목록으로도 수집되기 때문에
"IDENTIFIER"와 같은 다른 기능에 영향을 미치지 않고 Antlr 문법에 키워드 자체 규칙을 일치시키는 트릭/조항이 있습니까?
옵션''{backtrack = true;}'**을 시도했지만 결과가 없습니다. – Kishore
규칙 V_DECLARATION, V_DECLARATOR 및 V_VALUE는 렉서가 아닌 파서에 속합니다. –
@Maurice Perry는 특정 토큰을 일치시키는 매우 기본적인 렉서 규칙이며 다양한 규칙으로 전체 Java 문법을 포함하는 파서를 트리거합니다. – Kishore