ANTLR(7) - Mini Irenka Query

次のクエリをベースに、エラーリカバリの検査。

Irenkaで使ってるクエリ言語の機能を半分くらいにしてます。

@when
  hoge.foo.bar = {@link String}

くらいなら書ける。

ASTの生成

grammar Recovery1;

options {
  output = AST;
  ASTLabelType=CommonTree;
}

tokens {
  QUERY;
  CONSTRAINT;
  PLACEHOLDER;
  LINK;
  PROPERTY='.';
  TYPE_NAME;
  DECLARED_TYPE;
}

@header {
package research;
}

@lexer::header {
package research;
}

query
  : '@when' constraint* -> ^(QUERY constraint*)
  ;

constraint
  : expression '=' expression -> ^('=' expression expression)
  ;

expression
  : term -> term
  ;

term
  : primary_term ( PROPERTY^ NAME )*
  ;

primary_term
  : placeholder       -> placeholder
  | '{@link' link '}' -> link
  ;

placeholder
  : NAME -> ^(PLACEHOLDER NAME)
  ;

link
  : type_name -> ^(DECLARED_TYPE type_name)
  ;

type_name
  : NAME ( '.' NAME )* -> ^(TYPE_NAME NAME*)
  ;

NAME
  : ('A'..'Z'|'a'..'z'|'_') ('A'..'Z'|'a'..'z'|'0'..'9'|'_')*
  ;

WHITE_SPACE
  : ( ' ' | '\t' | '\r' | '\n' )+ { $channel = HIDDEN; }
  ;

目標は id:ashigeru:20070910:1189391042 の実現性についての検証。今日中にめどを立てたい。