おはよう皆、Treetopパーサ:スペースを扱う方法は?
は、私は現在、いくつかの基本的なRubyの文法を記述しようとしているが、私は今、解析スペースで立ち往生していますか? x = 1 + 1、
を処理できますが、x = 1 + 1を解析できません。
どのように解析することができますか?
すべての端末の後に十分なスペースを追加しようとしました。 それを解析することはできません。無し。..... どうすれば修正できますか? ありがとう、素敵な一日を。
grammar Test
rule main
s assign
end
rule assign
name:[a-z]+ s '=' s expression s
{
def to_ast
Assign.new(name.text_value.to_sym, expression.to_ast)
end
}
end
rule expression
add
end
rule add
left:brackets s '+' s right:add s
{
def to_ast
Add.new(left.to_ast, right.to_ast)
end
}
/
minus
end
rule minus
left:brackets s '-' s right:minus s
{
def to_ast
Minus.new(left.to_ast, right.to_ast)
end
}
/
brackets
end
rule brackets
'(' s expression ')' s
{
def to_ast
expression.to_ast
end
}
/
term
end
rule term
number/variable
end
rule number
[0-9]+ s
{
def to_ast
Number.new(text_value.to_i)
end
}
end
rule variable
[a-z]+ s
{
def to_ast
Variable.new(text_value.to_sym)
end
}
end
rule newline
s "\n"+ s
end
rule s
[ \t]*
end
end
このコードは 問題解決に動作します!!!!
私はすべての端末の後に十分なスペースを追加しましたが、それは何も表示しません.......... T_T – DoubleMay
あなたは私が言ったことをしていません。すべてのルールの開始時、またはスペースをスキップすることによって終わる 'expression'のようなルールの呼び出しの後に' space 'は必要ありません。最初に必要なルールは 'main'だけです。しかし、あなたは '' + ''のようなリテラルの中にスペースがあるので、あなたはまだ失敗しています。それらのスペースを削除します。 '![a-z]'を 'true'と' false'の直後に置かなければなりません。それ以降のスペースをスキップします。 – cliffordheath
聖なるイエス様、それは働きます!!!!!!!!!ありがとうございます!!!!!!!!!!!!! – DoubleMay