1

PLY で正規表現を書いていますが、yacc のように動作しないようです。

私はこれを書いた:

def p_expression_TYPE (p):
'''
    TYPE :  [' Discrete ',  ' Continuous ' ]
'''

TYPE がこれらの値のみを取ることができるという事実を表現するため: 離散または連続。

次のエラーがあります。

ERROR: la_grammaire_yacc.py:31: Illegal name '['' in rule 'TYPE'

誰かが私のコードの何が問題なのか教えてもらえますか? 式の王様をトークンとして定義する必要がありますか?

おかげさまで

4

1 に答える 1

1

正規表現と 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 
'''
于 2015-02-27T11:14:40.257 に答える