Antlr的+ * ?在yacc中都是什麼樣的模式?

趙年峰發表於2013-03-23

Antlr的+ * ?在yacc中都是什麼樣的模式?

因為正在完成的編譯器 breed 需要把java專案轉換到上面,所以需要對 Antlr的三種符號進行模式轉換。

我們先看一下三種符號的作用

  • ( + ) 至少出現一次,至多不限制。
  • ( * ) 可能出現,也可能不出現。
  • ( ? ) 最多出現一次,也可能不出現。

就上面的三種種情況 看看ply中的yacc中怎麼描述。

+

Antlr

annotations : (annotation)+ ;

yacc

annotations : annotation
            | annotations annotation
            ;

*

Antlr

annotationName : ID ('.' ID)* ;

yacc

annotationName : ID ( IDS ) ;

IDS : ID
    | IDS ‘.' ID
    | empty

?

Antlr

classDeclaration

: 'class' ID (typeParameters)? ('extends' type)?

('implements' typeList)?

classBody

;

yacc //我們假設yacc支援()吧! 要不得拆分出好多

classDeclaration : 'class' ID 
            (typeParameters ) ('extends' type) ('implements' typeList)        classBody ;
| 'class' ID                     ('extends' type)                             classBody ;
| 'class' ID    (typeParameters )                                              classBody ;
| 'class' ID                                     ('implements' typeList)    classBody ;
| 'class' ID (typeParameters ) ('extends' type)                              classBody ;
| 'class' ID                     ('extends' type) ('implements' typeList)    classBody ;
| 'class' ID (typeParameters )                     ('implements' typeList)    classBody ;

antlr使用正則的3種模式大量的節約了思考週期和程式碼的長度

相關文章