正規表現と yacc は異なる種類の動物です。チョムスキー タイプ 3 言語とチョムスキー タイプ 2 言語の違いを理解するのに役立ちます。flex と PLY の字句解析部分で使用される正規表現はチョムスキー タイプ 3 です。yacc、および PLY の文法規則部分は、チョムスキー タイプ 2 である Context Free Grammar の表現です。
それらには、異なる目的、異なる特性、および異なる表記法があります。その結果、省略したり、一方から他方へとルールを適用したりすることはできません。ただし、正規表現で記述できるものはすべて文脈自由文法で処理できます。書き方が違うだけ。(ほんの少しのコンピュータ サイエンス理論がそこに忍び寄っています)。
また、同様の例が記載されている PLYの優れたマニュアルを参照することも価値があります。
したがって、あなたの例では、TYPE の構文規則は次のように記述できます。
def p_expression_TYPE (p):
'''
TYPE : 'Discrete'
| 'Continuous'
'''
残念ながら、PLY には、'Discrete'
およびなどの文字リテラル'Continuous'
は、lex 部分でトークンとして宣言する必要があるという制限があります。
import ply.lex as lex
# List of token names. This is always required
tokens = (
'DISCRETE',
'CONTINUOUS'
)
# Regular expression rules for simple tokens
t_DISCRETE = r'Discrete'
t_CONTINUOUS = r'Continuous'
これで、パーサーを yacc.py に次のように配置できます。
def p_expression_TYPE (p):
'''
TYPE : DISCRETE
| CONTINUOUS
'''