2012-08-31 124 views
9

我有一個ANTLR JavaScript語法(取自互聯網),它似乎支持除正則表達式之外的所有東西。用ANTLR解析JavaScript正則表達式

與字面正則表達式的問題是,你有兩個規則,基本上是:

multiplicativeExpression 
    : unaryExpression (LT!* ('*' | '/' | '%')^ LT!* unaryExpression)* 

regexLiteral 
    : '/' RegexLiteralChar* '/' 
治所在RegexLiteralChar使用不同的詞法規則,而不是正常表達

(如雙引號不會終止它)。

這意味着我需要以某種方式從解析器中更改某種詞法分析器狀態。我怎樣才能做到這一點?它甚至有可能嗎?

+1

分析器之間的通信和詞法分析規則是不可能的。也許看看這個語法,它似乎處理正則表達式文字:http://research.xebic.com/es3/(檢查ZIP文件)。 –

回答

5

綜觀巴特煮布鍋here註釋中的語法,你可以看到這個評論,

面臨定義這一語法的主要挑戰是:

-1-歧義圍繞DIV與乘法表達式和正則表達式字面值相關。這是 解決了一些詞法分析驅動的魔術:門控語義謂詞 基於RegularExpressionsEnabled屬性的 值打開或關閉正則表達式的識別。當啓用常規 表達式時,它們優先於區分 表達式。啓用正則表達式的決定是 ,基於啓發式,前一個標記可視爲 除法的左側操作數的最後一個標記。

...

的areRegularExpressionsEnabled()函數定義爲,

private final boolean areRegularExpressionsEnabled() 
{ 
    if (last == null) 
    { 
     return true; 
    } 
    switch (last.getType()) 
    { 
    // identifier 
     case Identifier: 
    // literals 
     case NULL: 
     case TRUE: 
     case FALSE: 
     case THIS: 
     case OctalIntegerLiteral: 
     case DecimalLiteral: 
     case HexIntegerLiteral: 
     case StringLiteral: 
    // member access ending 
     case RBRACK: 
    // function call or nested expression ending 
     case RPAREN: 
      return false; 
    // otherwise OK 
     default: 
      return true; 
    } 
} 

然後該函數在RegularExpressionLiteral表達式中使用,

RegularExpressionLiteral 
    : { areRegularExpressionsEnabled() }?=> DIV RegularExpressionFirstChar RegularExpressionChar* DIV IdentifierPart* 
    ;