0

テストファイルを解析するために、識別子が数字で始まることを許可したいと思います。

私のルールは:

ID  :   ('a'..'z' | 'A'..'Z' | '0'..'9' | '_') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '&' | '/' | '-' | '.')*
;

ただし、このファイルの番号も一致させる必要があります。そのための私のルールは次のとおりです。

INT :   '0'..'9'+
;

INTが一致することは決してないので、明らかにAntlrはこれを許可しません。

これを許可する方法はありますか?具体的には、INTEGERの後にスペースのないIDをIDとして照合し、その後にスペースが続く場合にのみINTトークンを作成したいと思います。

例えば:

3BOB -> [ID with text "3BOB"]
3 BOB -> [INT with text "3"] [ID with text "BOB"]
4

2 に答える 2

2

IDトークンとINTトークンが定義されている順序を変更するだけです。

grammar qqq;

// Parser's rules.

root:
    (integer|identifier)+
;

integer:
    INT {System.out.println("INT with text '"+$INT.text+"'.");}
;

identifier:
    ID {System.out.println("ID with text '"+$ID.text+"'.");}
;

// Lexer's tokens.

INT:    '0'..'9'+
;

ID:    ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')
       ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '&' | '/' | '-' | '.')*
;

WS:    ' ' {skip();}
;

UNPREDICTED_TOKEN
:
    ~(' ') {System.out.println("Unpredicted token.");}
;

トークンが文法で定義される順序は重要です。文字列が複数のトークンに起因する可能性がある場合、最初に定義されたトークンに起因します。あなたの場合、整数「123」がまだIDに準拠しているときにINTに帰属させたい場合は、INT定義を最初に置きます。

Antlrのトークンマッチングは貪欲であるため、「123BOB」の「123」で停止することはありませんが、いずれのトークンも文字列と一致せず、最後に一致したトークンを取得するまで続行されます。したがって、識別子は数字で始めることができます。

トークンの順序に関するコメントは、MarkVolkmannによるこの記事にも記載されています。

于 2011-05-04T14:27:41.557 に答える
1

ルールの次の小さな変更でうまくいくはずです。

ID  :   ('0'..'9')* // optional numbers
        ('a'..'z' | 'A'..'Z' | '_' |  '&' | '/' | '-' | '.') // followed by mandatory character which is not a number
        ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '&' | '/' | '-' | '.')* // followed by more stuff (including numbers)
;

INT :   '0'..'9'+ // a number
;

識別子がオプションの数字で始まることを許可し、次の文字を必須にするだけです。

于 2011-05-05T22:22:55.710 に答える