otakbeku / elixir-bnf

BNF and Syntax diagram of Elixir programming language
5 stars 0 forks source link

boolean expression dibagi jadi dua rule #12

Open otakbeku opened 3 years ago

otakbeku commented 3 years ago

https://github.com/otakbeku/elixir-bnf/blob/2ce635f25a335d32c0ca6db5e5e09bf68f6cb2af/operator.bnf#L19

Karena boolean di elixir ada dua jenis, seperitnya lebih baik dipisah rulenya. Soalnya di guards cuma bisa pakai yang strict aja.

Kalo gini gimana? @IvanAldion @banditelol

<boolean_expr> ::= <boolean> | <boolean_strict_expr> |  <boolean_relaxed_expr>
<boolean_strict_expr> ::= <boolean_expr> <strict_and_expr> | <boolean_expr> <strict_or_expr> |  <strict_not_expr>
<boolean_relaxed_expr> ::= <term> <relaxed_and_expr> |  <boolean_expr> <relaxed_and_expr> |  <boolean_expr> <relaxed_or_expr> | <relaxed_not_expr>
IvanAldion commented 3 years ago

Kalo dari gw lebih baik seperti ini kalau mau dipisah:

<boolean_expr> ::= <strict_boolean_expr> | <relaxed_boolean_operator> | <relaxed_boolean_term> | (<boolean_expr>)
<relaxed_boolean_expr> ::= <boolean_expr> <relaxed_boolean_operator> <boolean_expr>
<strict_boolean_expr> ::= <strict_boolean_term> <strict_boolean_operator> <boolean_expr>
<relaxed_boolean_operator> ::= && | ||
<strict_boolean_operator> ::= and | or
<strict_boolean_term> ::= <boolean> | not(<strict_boolean_term>) | !<strict_boolean_term>
<relaxed_boolean_term> ::= <term> | not(<relaxed_boolean_term>) | !<relaxed_boolean_term>

Soalnya ada kasus seperti:

control = ((a and !b) or c) && (c or (d && not(d))) and (e && !not(!f) || e)
if control do IO.puts "Hello world!" end

Asumsi semua variabel tipenya bener (variabel di sebelah kiri 'and' dan 'or' selalu boolean) itu bisa di compile. Versi yang lama itu gk bisa diturunkan jadi yang di atas.

otakbeku commented 3 years ago

ohhh oke, lebih setuju sama yang dipisah

banditelol commented 3 years ago

btw yang dipisah itu gabisa nurunin not(a && b) ya?

IvanAldion commented 3 years ago

Belum bisa kalau yang seperti itu

IvanAldion commented 3 years ago

Yang ini sudah bisa nurunin not(a && b).

<boolean_expr> ::= <strict_boolean_expr> | <relaxed_boolean_expr> | <relaxed_boolean_term> | <not_boolean_expr> |(<boolean_expr>)
<not_boolean_expr> ::= not(<boolean_expr>) | !<boolean_expr>
<relaxed_boolean_expr> ::= <boolean_expr> <relaxed_boolean_operator> <boolean_expr>
<strict_boolean_expr> ::= <strict_boolean_term> <strict_boolean_operator> <boolean_expr>
<relaxed_boolean_operator> ::= && | ||
<strict_boolean_operator> ::= and | or
<strict_boolean_term> ::= <boolean>
<relaxed_boolean_term> ::= <term>
banditelol commented 3 years ago

wokeh mantep, tinggal ditambahin ke file bnfnya @IvanAldion

btw IMHO karena kita gabisa mastiin kalau ruas kirinya teh suatu identifier yang kalau di evaluate jadi boolean (dan pada tahap parsing juga kita blm nge evaluate si identifier/ expressionnya), menurut urang si relaxed sama strict secara syntatic mah sama aja sih, jadi gausah dipisah gitu