簡體   English   中英

antlr4 + python:調試令牌匹配

[英]antlr4 + python: debug token match

我正在使用antlr4 + python target來匹配這樣的短語,

select 1 from dual where id=.0union select 1

令牌是:

['select', '1', 'from', 'dual', 'where', 'id', '=', '.0union', 'select', '1']

我的問題是, .0union令牌已合並為一個令牌,也稱為.0union ,而antlr報告這樣的錯誤,

line 1:32 mismatched input '=' expecting {<EOF>, '&&', <INVALID>, ';', <INVALID>, <INVALID>, <INVALID>, <INVALID>, <INVALID>, <INVALID>, <INVALID>, <INVALID>, <INVALID>, <INVALID>, <INVALID>, <INVALID>}

關於調試有什么想法嗎?

有什么方法可以調試令牌匹配過程?

正如我們在私人討論中發現的那樣,該問題與語法中如何定義點標識符規則有關。 .0union.union類的輸入之間存在沖突。 第一種形式應被視為十進制數和關鍵字,而第二種形式應被視為一個整體並標記為點標識符。 因此,解決方案是在點標識符中不允許點后的數字(始終必須解析為小數):

FLOAT_NUMBER: DECIMAL_NUMBER [eE] (MINUS_OPERATOR | PLUS_OPERATOR)? DIGITS;
DECIMAL_NUMBER: DIGITS? DOT_SYMBOL DIGITS;

// Special rule that should also match all keywords if they are directly preceded by a dot.
// Hence it's defined before all keywords.
DOT_IDENTIFIER: DOT_SYMBOL LETTER_WHEN_UNQUOTED_NO_DIGIT LETTER_WHEN_UNQUOTED*;

fragment LETTER_WHEN_UNQUOTED:
    DIGIT
    | LETTER_WHEN_UNQUOTED_NO_DIGIT
;

fragment LETTER_WHEN_UNQUOTED_NO_DIGIT:
    [a-zA-Z_$\u0080-\uffff]
;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM