2012-01-25 17 views
0

の文法私はそれのためのパーサを作成する方法のように理解することはできませんよ、この文法があります。新しい言語

module = properties fields methods module#3 'end' 

properties = list#0 (property add#2)* 
property = 'class' 'name' class# ';' 

fields = list#0 (field add#2)* 
field = type list#0 id add#2 [';'/','] ! (',' id add#2)* ';' field#2 

methods = list#0 (method add#2)* 
method = (type id/nothing#0 id) ! '(' args ')' follow method#4 
args = list#0 (arg add#2 (',' arg add#2)*)? 
arg = type id ! arg#2/nothing#0 id ! arg#2 

statements = list#0 (statement add#2)* 
statement = do/jump/compound/simple 
follow = block/jump/compound/simple 
jump = break/continue/return 
compound = if/while 
simple = local/assign 

do = 'do' '{' statements '}' do#1 
block = '{' statements '}' block#1 

break = 'break' ';' break#0 
continue = 'continue' ';' continue#0 
return = 'return' (exp/nothing#0) ';' return#1 

if = 'if' '(' exp ')' follow ('else' follow/nothing#0) if#3 
while = 'while' '(' exp ')' follow while#2 

local = type id ! init? local#2 ';' 
init = 'assign' exp assign#2/'.' id dot#2 '(' exps ')' call#2 
assign = id 'assign' ! exp assign#2 ';' 

exp = id ('(' exps ')' call#2/'.' id dot#2 '(' exps ')' call#2)? 
exps = list#0 (exp add#2 (',' exp add#2)*)? 
type = 'name' type# 
id = 'name' id# 

'.' = 'DOT' 

することは誰も私にはこの文法を理解してくださいでした。 おかげ

+0

「この文法を理解する」とはどういう意味ですか?あなたはもっと具体的になりますか? – templatetypedef

+0

@templatetypedef well..iこの文法を理解できません。特に最初の数行。 – Maverick

+0

あなたはどうしたら分かりませんか?文脈自由文法や正規表現を理解していますか?あなたが理解できないことに特化していない限り、私たちはあなたを助けることはできません。 – templatetypedef

答えて

1

このコンパイラがすべきモジュールを解析するために、そう

a module consists of properties, followed by fields, followed by methods, followed by the word "end" 

module = properties fields methods module#3 'end' 

はその意味

parse properties 
parse fields 
parse methods 
match the word "end" 

アイテム "#" とは、作成すべき構文ノードのタイプ、前回の解析resの数を示す数字ウルトラはそれに渡されるべきです。

Python言語でコードは次のようになります:

def parse_module(): 
    properties = parse_properties() 
    fields = parse_fields() 
    methods = parse_methods() 
    module = make_module(properties, fields, methods) 
    match("end") 
    return module 

Aは、 "/" "*(...)" の繰り返しの任意の数を示し、および代替物を分離します "?"オプションの項目を示します。

関連する問題