# ANTLRメモ ###### tags: `ANTLR` [See also : ANTLR](/vcMufAH5S3icIJfEcZZmjA) <hr/> [toc] <hr/> ## fragment とは JavaCCでいうラベル(#付きトークン)。 1トークンとしてLexerに生成させない。 整数の10進数、16進数などを1つのトークンとして束ねるときなどに使う。 Stackoverflow https://stackoverflow.com/questions/6487593/what-does-fragment-mean-in-antlr e.g. JavaCC ~~~javacc TOKEN : { <INTEGER_LITERAL : <DECIMAL_LITERAL> | <HEX_LITERAL> > | <#DECIMAL_LITERAL: ( "0" ) | ( ["1"-"9"] (["0"-"9"])* ) > | <#HEX_LITERAL: "9" (["0"-"9","a"-"f","A"-"F"])+ ["h","H"] > } ~~~ ANTLR ~~~antlr kkk: lplpl->skip; ~~~ ## Lexer, Parserの宣言 ~~~antlr lexer grammar Hoge; parser grammar Hoge; ~~~ ## Grammarの拡張 ~~~antlr import Hoge; ~~~ ## 生成されたJavaコードを既存のコードから参照する@Gradle + IntelliJ IDEA ソースセットにパスを追記 build.gradle ~~~groovy sourceSets { main{ kotlin { srcDirs += 'path/to/generated/antlr' } java { srcDirs += 'path/to/generated/antlr' } } } ~~~ ## Gradle + IntelliJ IDEAでの g4 ファイル編集時 build.gradle ~~~groovy arguments << '-lib' << 'path/to/antlr/generated' copy { from outputDirectory into 'src/main/antlr' include '*.tokens' } ~~~ としないと g4 ファイルから *.tokens *.g4 ファイルが見えずにエラーになる(IntelliJ上でのみ。) g4ファイル編集はVSCode推奨 ## パーサ内にプログラムコードを埋め込む https://github.com/antlr/antlr4/blob/master/doc/parser-rules.md#rule-context-objects > If we had another rule, s, that references field, an embedded action could access the list of e rule matches performed by field: ~~~antlr s : field { List<EContext> x = $field.ctx.e(); ... } ; ~~~