Syntax for a simple scripting language [closed]

Clash Royale CLAN TAG#URR8PPP
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty margin-bottom:0;
up vote
3
down vote
favorite
I'm creating a small simple scripting language for fun and as a learning exercise. For the first iteration I want it to be very simple:
- C-style syntax
- Functions are defined globally as in C, no passing functions around (yet)
- The interpreter calls the "main" function (if it finds one)
- String and number datatypes, no objects or arrays
I have written a syntax (with help from this syntax for C) and a simple recursive descent parser. However while testing I discovered a few undesirable quirks; the parser works perfectly but some problems with the syntax itself are causing undesirable behaviour in the actual language. Therefore I thought it would be good to post the syntax here for review and to see if there are any other obvious issues
// program/script structure
program : decl_list
decl_list : decl_list decl
| decl
decl : var_decl
| func_decl
var_decl : 'let' identifier ';'
| 'let' identifier '=' exp ';'
func_decl : 'func' identifier '(' arguments_decl ')' block
| 'func' identifier '(' ')' block
arguments_decl : arguments_decl ',' identifier
| identifier
// statements and flow control
block : '' statement_list ''
statement_list : statement_list statement
| statement
statement : if_construct
| while_construct
| var_decl
| assign_stat
| exp_stat
assign_stat : identifier '=' exp ';' // TODO: more assignment operators (+=, -=, etc)
exp_stat : exp ';'
if_construct : if_block elif_list else_block
| if_block else_block
| if_block
if_block : 'if' '(' exp ')' block
elif_list : elif_list elif_block
| elif_block
elif_block : 'else' if_block
else_block : 'else' block
while_construct : 'while' '(' exp ')' block
continue_stat : 'continue' ';'
break_stat : 'break' ';'
return_stat : 'return' exp ';'
| 'return' ';'
// expressions
exp : cond_exp
// ternary expression
cond_exp : logic_or_exp '?' cond_exp ':' cond_exp
// bitwise and logical binary operators
logic_or_exp : logic_or_exp '||' logic_xor_exp
| logic_xor_exp
logic_xor_exp : logic_xor_exp '^^' logic_and_exp
| logic_and_exp
logic_and_exp : logic_and_exp '&&' bit_or_exp
| bit_or_exp
bit_or_exp : bit_or_exp '|' bit_xor_exp
| bit_xor_exp
bit_xor_exp : bit_xor_exp '^' bit_and_exp
| bit_and_exp
bit_and_exp : bit_and_exp '&' cmp_exp
| cmp_exp
// comparison operators
cmp_exp : cmp_exp '==' add_exp
| cmp_exp '!=' add_exp
| cmp_exp '<' add_exp
| cmp_exp '>' add_exp
| cmp_exp '<=' add_exp
| cmp_exp '>=' add_exp
| add_exp
// arithmetic binary operators
add_exp : add_exp '+' mul_exp
| add_exp '-' mul_exp
| mul_exp
mul_exp : mul_exp '*' pow_exp
| mul_exp '/' pow_exp
| mul_exp '//' pow_exp
| pow_exp
pow_exp : pow_exp '**' shift_exp
| shift_exp
shift_exp: : shift_exp '>>' unary_exp
| shift_exp '<<' unary_exp
| unary_exp
// unary operators
unary_exp: : '+' unary_exp
| '-' unary_exp
| '!' unary_exp
| '~' unary_exp
| postfix_exp
// other expression types
postfix_exp : postfix_exp '[' exp ']' // array access operator
| postfix_exp '(' arguments_list ')' // call operator
| postfix_exp '(' ')' // call (no arguments)
| postfix_exp '.' identifier // property access operator
| primary_exp
primary_exp : '(' exp ')'
| literal_number
| literal_string
| identifier
arguments_list : arguments_list ',' exp
| exp
// omitted for simplicity
literal_number : ...
literal_string : ...
identifier : ...
Example: In the previous iteration of this syntax, I had defined the "+" and "-" binary expressions separately like this:
add_exp : add_exp '+' sub_exp
| sub_exp
sub_exp : sub_exp '-' mul_exp
| mul_exp
mul_exp ...
This causes '-' to always precede '+', this is the kind of mistake I want to avoid!
grammar
closed as off-topic by Peilonrayz, 200_success Jan 23 at 17:58
This question appears to be off-topic. The users who voted to close gave this specific reason:
- "Questions containing broken code or asking for advice about code not yet written are off-topic, as the code is not ready for review. After the question has been edited to contain working code, we will consider reopening it." â Peilonrayz, 200_success
add a comment |Â
up vote
3
down vote
favorite
I'm creating a small simple scripting language for fun and as a learning exercise. For the first iteration I want it to be very simple:
- C-style syntax
- Functions are defined globally as in C, no passing functions around (yet)
- The interpreter calls the "main" function (if it finds one)
- String and number datatypes, no objects or arrays
I have written a syntax (with help from this syntax for C) and a simple recursive descent parser. However while testing I discovered a few undesirable quirks; the parser works perfectly but some problems with the syntax itself are causing undesirable behaviour in the actual language. Therefore I thought it would be good to post the syntax here for review and to see if there are any other obvious issues
// program/script structure
program : decl_list
decl_list : decl_list decl
| decl
decl : var_decl
| func_decl
var_decl : 'let' identifier ';'
| 'let' identifier '=' exp ';'
func_decl : 'func' identifier '(' arguments_decl ')' block
| 'func' identifier '(' ')' block
arguments_decl : arguments_decl ',' identifier
| identifier
// statements and flow control
block : '' statement_list ''
statement_list : statement_list statement
| statement
statement : if_construct
| while_construct
| var_decl
| assign_stat
| exp_stat
assign_stat : identifier '=' exp ';' // TODO: more assignment operators (+=, -=, etc)
exp_stat : exp ';'
if_construct : if_block elif_list else_block
| if_block else_block
| if_block
if_block : 'if' '(' exp ')' block
elif_list : elif_list elif_block
| elif_block
elif_block : 'else' if_block
else_block : 'else' block
while_construct : 'while' '(' exp ')' block
continue_stat : 'continue' ';'
break_stat : 'break' ';'
return_stat : 'return' exp ';'
| 'return' ';'
// expressions
exp : cond_exp
// ternary expression
cond_exp : logic_or_exp '?' cond_exp ':' cond_exp
// bitwise and logical binary operators
logic_or_exp : logic_or_exp '||' logic_xor_exp
| logic_xor_exp
logic_xor_exp : logic_xor_exp '^^' logic_and_exp
| logic_and_exp
logic_and_exp : logic_and_exp '&&' bit_or_exp
| bit_or_exp
bit_or_exp : bit_or_exp '|' bit_xor_exp
| bit_xor_exp
bit_xor_exp : bit_xor_exp '^' bit_and_exp
| bit_and_exp
bit_and_exp : bit_and_exp '&' cmp_exp
| cmp_exp
// comparison operators
cmp_exp : cmp_exp '==' add_exp
| cmp_exp '!=' add_exp
| cmp_exp '<' add_exp
| cmp_exp '>' add_exp
| cmp_exp '<=' add_exp
| cmp_exp '>=' add_exp
| add_exp
// arithmetic binary operators
add_exp : add_exp '+' mul_exp
| add_exp '-' mul_exp
| mul_exp
mul_exp : mul_exp '*' pow_exp
| mul_exp '/' pow_exp
| mul_exp '//' pow_exp
| pow_exp
pow_exp : pow_exp '**' shift_exp
| shift_exp
shift_exp: : shift_exp '>>' unary_exp
| shift_exp '<<' unary_exp
| unary_exp
// unary operators
unary_exp: : '+' unary_exp
| '-' unary_exp
| '!' unary_exp
| '~' unary_exp
| postfix_exp
// other expression types
postfix_exp : postfix_exp '[' exp ']' // array access operator
| postfix_exp '(' arguments_list ')' // call operator
| postfix_exp '(' ')' // call (no arguments)
| postfix_exp '.' identifier // property access operator
| primary_exp
primary_exp : '(' exp ')'
| literal_number
| literal_string
| identifier
arguments_list : arguments_list ',' exp
| exp
// omitted for simplicity
literal_number : ...
literal_string : ...
identifier : ...
Example: In the previous iteration of this syntax, I had defined the "+" and "-" binary expressions separately like this:
add_exp : add_exp '+' sub_exp
| sub_exp
sub_exp : sub_exp '-' mul_exp
| mul_exp
mul_exp ...
This causes '-' to always precede '+', this is the kind of mistake I want to avoid!
grammar
closed as off-topic by Peilonrayz, 200_success Jan 23 at 17:58
This question appears to be off-topic. The users who voted to close gave this specific reason:
- "Questions containing broken code or asking for advice about code not yet written are off-topic, as the code is not ready for review. After the question has been edited to contain working code, we will consider reopening it." â Peilonrayz, 200_success
2
What language is this grammar description in? Some generic BNF? Or does this serve as input to a parser generator tool?
â 200_success
Jan 19 at 2:56
I wrote this grammar myself just as a reference while working on the interpreter, as I wrote the parser myself by hand, not using yacc/antlr or any generators. So it might be using the wrong symbols or not be a recognisable structure, for which I can only apologise and hope the meaning is still clear
â JamesMac
Jan 19 at 12:10
This question is being discussed on meta
â Mast
Jan 19 at 20:48
add a comment |Â
up vote
3
down vote
favorite
up vote
3
down vote
favorite
I'm creating a small simple scripting language for fun and as a learning exercise. For the first iteration I want it to be very simple:
- C-style syntax
- Functions are defined globally as in C, no passing functions around (yet)
- The interpreter calls the "main" function (if it finds one)
- String and number datatypes, no objects or arrays
I have written a syntax (with help from this syntax for C) and a simple recursive descent parser. However while testing I discovered a few undesirable quirks; the parser works perfectly but some problems with the syntax itself are causing undesirable behaviour in the actual language. Therefore I thought it would be good to post the syntax here for review and to see if there are any other obvious issues
// program/script structure
program : decl_list
decl_list : decl_list decl
| decl
decl : var_decl
| func_decl
var_decl : 'let' identifier ';'
| 'let' identifier '=' exp ';'
func_decl : 'func' identifier '(' arguments_decl ')' block
| 'func' identifier '(' ')' block
arguments_decl : arguments_decl ',' identifier
| identifier
// statements and flow control
block : '' statement_list ''
statement_list : statement_list statement
| statement
statement : if_construct
| while_construct
| var_decl
| assign_stat
| exp_stat
assign_stat : identifier '=' exp ';' // TODO: more assignment operators (+=, -=, etc)
exp_stat : exp ';'
if_construct : if_block elif_list else_block
| if_block else_block
| if_block
if_block : 'if' '(' exp ')' block
elif_list : elif_list elif_block
| elif_block
elif_block : 'else' if_block
else_block : 'else' block
while_construct : 'while' '(' exp ')' block
continue_stat : 'continue' ';'
break_stat : 'break' ';'
return_stat : 'return' exp ';'
| 'return' ';'
// expressions
exp : cond_exp
// ternary expression
cond_exp : logic_or_exp '?' cond_exp ':' cond_exp
// bitwise and logical binary operators
logic_or_exp : logic_or_exp '||' logic_xor_exp
| logic_xor_exp
logic_xor_exp : logic_xor_exp '^^' logic_and_exp
| logic_and_exp
logic_and_exp : logic_and_exp '&&' bit_or_exp
| bit_or_exp
bit_or_exp : bit_or_exp '|' bit_xor_exp
| bit_xor_exp
bit_xor_exp : bit_xor_exp '^' bit_and_exp
| bit_and_exp
bit_and_exp : bit_and_exp '&' cmp_exp
| cmp_exp
// comparison operators
cmp_exp : cmp_exp '==' add_exp
| cmp_exp '!=' add_exp
| cmp_exp '<' add_exp
| cmp_exp '>' add_exp
| cmp_exp '<=' add_exp
| cmp_exp '>=' add_exp
| add_exp
// arithmetic binary operators
add_exp : add_exp '+' mul_exp
| add_exp '-' mul_exp
| mul_exp
mul_exp : mul_exp '*' pow_exp
| mul_exp '/' pow_exp
| mul_exp '//' pow_exp
| pow_exp
pow_exp : pow_exp '**' shift_exp
| shift_exp
shift_exp: : shift_exp '>>' unary_exp
| shift_exp '<<' unary_exp
| unary_exp
// unary operators
unary_exp: : '+' unary_exp
| '-' unary_exp
| '!' unary_exp
| '~' unary_exp
| postfix_exp
// other expression types
postfix_exp : postfix_exp '[' exp ']' // array access operator
| postfix_exp '(' arguments_list ')' // call operator
| postfix_exp '(' ')' // call (no arguments)
| postfix_exp '.' identifier // property access operator
| primary_exp
primary_exp : '(' exp ')'
| literal_number
| literal_string
| identifier
arguments_list : arguments_list ',' exp
| exp
// omitted for simplicity
literal_number : ...
literal_string : ...
identifier : ...
Example: In the previous iteration of this syntax, I had defined the "+" and "-" binary expressions separately like this:
add_exp : add_exp '+' sub_exp
| sub_exp
sub_exp : sub_exp '-' mul_exp
| mul_exp
mul_exp ...
This causes '-' to always precede '+', this is the kind of mistake I want to avoid!
grammar
I'm creating a small simple scripting language for fun and as a learning exercise. For the first iteration I want it to be very simple:
- C-style syntax
- Functions are defined globally as in C, no passing functions around (yet)
- The interpreter calls the "main" function (if it finds one)
- String and number datatypes, no objects or arrays
I have written a syntax (with help from this syntax for C) and a simple recursive descent parser. However while testing I discovered a few undesirable quirks; the parser works perfectly but some problems with the syntax itself are causing undesirable behaviour in the actual language. Therefore I thought it would be good to post the syntax here for review and to see if there are any other obvious issues
// program/script structure
program : decl_list
decl_list : decl_list decl
| decl
decl : var_decl
| func_decl
var_decl : 'let' identifier ';'
| 'let' identifier '=' exp ';'
func_decl : 'func' identifier '(' arguments_decl ')' block
| 'func' identifier '(' ')' block
arguments_decl : arguments_decl ',' identifier
| identifier
// statements and flow control
block : '' statement_list ''
statement_list : statement_list statement
| statement
statement : if_construct
| while_construct
| var_decl
| assign_stat
| exp_stat
assign_stat : identifier '=' exp ';' // TODO: more assignment operators (+=, -=, etc)
exp_stat : exp ';'
if_construct : if_block elif_list else_block
| if_block else_block
| if_block
if_block : 'if' '(' exp ')' block
elif_list : elif_list elif_block
| elif_block
elif_block : 'else' if_block
else_block : 'else' block
while_construct : 'while' '(' exp ')' block
continue_stat : 'continue' ';'
break_stat : 'break' ';'
return_stat : 'return' exp ';'
| 'return' ';'
// expressions
exp : cond_exp
// ternary expression
cond_exp : logic_or_exp '?' cond_exp ':' cond_exp
// bitwise and logical binary operators
logic_or_exp : logic_or_exp '||' logic_xor_exp
| logic_xor_exp
logic_xor_exp : logic_xor_exp '^^' logic_and_exp
| logic_and_exp
logic_and_exp : logic_and_exp '&&' bit_or_exp
| bit_or_exp
bit_or_exp : bit_or_exp '|' bit_xor_exp
| bit_xor_exp
bit_xor_exp : bit_xor_exp '^' bit_and_exp
| bit_and_exp
bit_and_exp : bit_and_exp '&' cmp_exp
| cmp_exp
// comparison operators
cmp_exp : cmp_exp '==' add_exp
| cmp_exp '!=' add_exp
| cmp_exp '<' add_exp
| cmp_exp '>' add_exp
| cmp_exp '<=' add_exp
| cmp_exp '>=' add_exp
| add_exp
// arithmetic binary operators
add_exp : add_exp '+' mul_exp
| add_exp '-' mul_exp
| mul_exp
mul_exp : mul_exp '*' pow_exp
| mul_exp '/' pow_exp
| mul_exp '//' pow_exp
| pow_exp
pow_exp : pow_exp '**' shift_exp
| shift_exp
shift_exp: : shift_exp '>>' unary_exp
| shift_exp '<<' unary_exp
| unary_exp
// unary operators
unary_exp: : '+' unary_exp
| '-' unary_exp
| '!' unary_exp
| '~' unary_exp
| postfix_exp
// other expression types
postfix_exp : postfix_exp '[' exp ']' // array access operator
| postfix_exp '(' arguments_list ')' // call operator
| postfix_exp '(' ')' // call (no arguments)
| postfix_exp '.' identifier // property access operator
| primary_exp
primary_exp : '(' exp ')'
| literal_number
| literal_string
| identifier
arguments_list : arguments_list ',' exp
| exp
// omitted for simplicity
literal_number : ...
literal_string : ...
identifier : ...
Example: In the previous iteration of this syntax, I had defined the "+" and "-" binary expressions separately like this:
add_exp : add_exp '+' sub_exp
| sub_exp
sub_exp : sub_exp '-' mul_exp
| mul_exp
mul_exp ...
This causes '-' to always precede '+', this is the kind of mistake I want to avoid!
grammar
asked Jan 18 at 17:08
JamesMac
161
161
closed as off-topic by Peilonrayz, 200_success Jan 23 at 17:58
This question appears to be off-topic. The users who voted to close gave this specific reason:
- "Questions containing broken code or asking for advice about code not yet written are off-topic, as the code is not ready for review. After the question has been edited to contain working code, we will consider reopening it." â Peilonrayz, 200_success
closed as off-topic by Peilonrayz, 200_success Jan 23 at 17:58
This question appears to be off-topic. The users who voted to close gave this specific reason:
- "Questions containing broken code or asking for advice about code not yet written are off-topic, as the code is not ready for review. After the question has been edited to contain working code, we will consider reopening it." â Peilonrayz, 200_success
2
What language is this grammar description in? Some generic BNF? Or does this serve as input to a parser generator tool?
â 200_success
Jan 19 at 2:56
I wrote this grammar myself just as a reference while working on the interpreter, as I wrote the parser myself by hand, not using yacc/antlr or any generators. So it might be using the wrong symbols or not be a recognisable structure, for which I can only apologise and hope the meaning is still clear
â JamesMac
Jan 19 at 12:10
This question is being discussed on meta
â Mast
Jan 19 at 20:48
add a comment |Â
2
What language is this grammar description in? Some generic BNF? Or does this serve as input to a parser generator tool?
â 200_success
Jan 19 at 2:56
I wrote this grammar myself just as a reference while working on the interpreter, as I wrote the parser myself by hand, not using yacc/antlr or any generators. So it might be using the wrong symbols or not be a recognisable structure, for which I can only apologise and hope the meaning is still clear
â JamesMac
Jan 19 at 12:10
This question is being discussed on meta
â Mast
Jan 19 at 20:48
2
2
What language is this grammar description in? Some generic BNF? Or does this serve as input to a parser generator tool?
â 200_success
Jan 19 at 2:56
What language is this grammar description in? Some generic BNF? Or does this serve as input to a parser generator tool?
â 200_success
Jan 19 at 2:56
I wrote this grammar myself just as a reference while working on the interpreter, as I wrote the parser myself by hand, not using yacc/antlr or any generators. So it might be using the wrong symbols or not be a recognisable structure, for which I can only apologise and hope the meaning is still clear
â JamesMac
Jan 19 at 12:10
I wrote this grammar myself just as a reference while working on the interpreter, as I wrote the parser myself by hand, not using yacc/antlr or any generators. So it might be using the wrong symbols or not be a recognisable structure, for which I can only apologise and hope the meaning is still clear
â JamesMac
Jan 19 at 12:10
This question is being discussed on meta
â Mast
Jan 19 at 20:48
This question is being discussed on meta
â Mast
Jan 19 at 20:48
add a comment |Â
1 Answer
1
active
oldest
votes
up vote
3
down vote
I cannot address your main concern about the undesirable behavior, and I am afraid nobody can: only you know what behavior is desirable. You may provide (failing) test cases, but that would jeopardize on-topikness of the question.
Some random observation on the grammar follow:
You disallow an empty
statement_list, but you treatvar_declas a statement. It means thatwhile (foo)is invalid, but
while (foo)
let bar;is valid.
Does not make much sense for me.
The function argument list cannot be empty. Is it intentional?
I strongly recommend to factor the operators out. For example,
cmp_exp : cmp_exp cmp_op add_exp
| add_expand spell
cmp_opin a separate rule.It seems that
cond_exprule is incomplete. I'd expectcond_exp : logic_or_exp '?' cond_exp ':' cond_exp
| logic_or_expBesides, I have a feeling that the
cond_exp ':' cond_exppart is extremely hard to parse meaningfully. The grammar you refer toconditional_exp : logical_or_exp
| logical_or_exp '?' exp ':' conditional_exp
;segregates
expandconditional_expfor a reason.
Thanks for the great comments! The point about empty statement lists is good so I will fix that by allowing an empty block (as that's the only place statement_list is used. Thanks for the point on operators as well I might do that just to make my own life easier :)
â JamesMac
Jan 19 at 12:15
Function argument list can be empty unless I am making a mistake? there is a rule for func_decl to define a function with no arguments, and there is a rule for postfix_exp to call something without any arguments
â JamesMac
Jan 19 at 12:17
The cond_exp rule was wrong as well thanks, I'm not sure how that happened, perhaps I deleted a line by mistake when posting the question, because it's fine in my project! Parsing "cond_exp : cond_exp" hasn't been a problem at all for me, I have tested it very carefully; I can post the code that does this although i'm sure it's nothing special
â JamesMac
Jan 19 at 12:20
add a comment |Â
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
3
down vote
I cannot address your main concern about the undesirable behavior, and I am afraid nobody can: only you know what behavior is desirable. You may provide (failing) test cases, but that would jeopardize on-topikness of the question.
Some random observation on the grammar follow:
You disallow an empty
statement_list, but you treatvar_declas a statement. It means thatwhile (foo)is invalid, but
while (foo)
let bar;is valid.
Does not make much sense for me.
The function argument list cannot be empty. Is it intentional?
I strongly recommend to factor the operators out. For example,
cmp_exp : cmp_exp cmp_op add_exp
| add_expand spell
cmp_opin a separate rule.It seems that
cond_exprule is incomplete. I'd expectcond_exp : logic_or_exp '?' cond_exp ':' cond_exp
| logic_or_expBesides, I have a feeling that the
cond_exp ':' cond_exppart is extremely hard to parse meaningfully. The grammar you refer toconditional_exp : logical_or_exp
| logical_or_exp '?' exp ':' conditional_exp
;segregates
expandconditional_expfor a reason.
Thanks for the great comments! The point about empty statement lists is good so I will fix that by allowing an empty block (as that's the only place statement_list is used. Thanks for the point on operators as well I might do that just to make my own life easier :)
â JamesMac
Jan 19 at 12:15
Function argument list can be empty unless I am making a mistake? there is a rule for func_decl to define a function with no arguments, and there is a rule for postfix_exp to call something without any arguments
â JamesMac
Jan 19 at 12:17
The cond_exp rule was wrong as well thanks, I'm not sure how that happened, perhaps I deleted a line by mistake when posting the question, because it's fine in my project! Parsing "cond_exp : cond_exp" hasn't been a problem at all for me, I have tested it very carefully; I can post the code that does this although i'm sure it's nothing special
â JamesMac
Jan 19 at 12:20
add a comment |Â
up vote
3
down vote
I cannot address your main concern about the undesirable behavior, and I am afraid nobody can: only you know what behavior is desirable. You may provide (failing) test cases, but that would jeopardize on-topikness of the question.
Some random observation on the grammar follow:
You disallow an empty
statement_list, but you treatvar_declas a statement. It means thatwhile (foo)is invalid, but
while (foo)
let bar;is valid.
Does not make much sense for me.
The function argument list cannot be empty. Is it intentional?
I strongly recommend to factor the operators out. For example,
cmp_exp : cmp_exp cmp_op add_exp
| add_expand spell
cmp_opin a separate rule.It seems that
cond_exprule is incomplete. I'd expectcond_exp : logic_or_exp '?' cond_exp ':' cond_exp
| logic_or_expBesides, I have a feeling that the
cond_exp ':' cond_exppart is extremely hard to parse meaningfully. The grammar you refer toconditional_exp : logical_or_exp
| logical_or_exp '?' exp ':' conditional_exp
;segregates
expandconditional_expfor a reason.
Thanks for the great comments! The point about empty statement lists is good so I will fix that by allowing an empty block (as that's the only place statement_list is used. Thanks for the point on operators as well I might do that just to make my own life easier :)
â JamesMac
Jan 19 at 12:15
Function argument list can be empty unless I am making a mistake? there is a rule for func_decl to define a function with no arguments, and there is a rule for postfix_exp to call something without any arguments
â JamesMac
Jan 19 at 12:17
The cond_exp rule was wrong as well thanks, I'm not sure how that happened, perhaps I deleted a line by mistake when posting the question, because it's fine in my project! Parsing "cond_exp : cond_exp" hasn't been a problem at all for me, I have tested it very carefully; I can post the code that does this although i'm sure it's nothing special
â JamesMac
Jan 19 at 12:20
add a comment |Â
up vote
3
down vote
up vote
3
down vote
I cannot address your main concern about the undesirable behavior, and I am afraid nobody can: only you know what behavior is desirable. You may provide (failing) test cases, but that would jeopardize on-topikness of the question.
Some random observation on the grammar follow:
You disallow an empty
statement_list, but you treatvar_declas a statement. It means thatwhile (foo)is invalid, but
while (foo)
let bar;is valid.
Does not make much sense for me.
The function argument list cannot be empty. Is it intentional?
I strongly recommend to factor the operators out. For example,
cmp_exp : cmp_exp cmp_op add_exp
| add_expand spell
cmp_opin a separate rule.It seems that
cond_exprule is incomplete. I'd expectcond_exp : logic_or_exp '?' cond_exp ':' cond_exp
| logic_or_expBesides, I have a feeling that the
cond_exp ':' cond_exppart is extremely hard to parse meaningfully. The grammar you refer toconditional_exp : logical_or_exp
| logical_or_exp '?' exp ':' conditional_exp
;segregates
expandconditional_expfor a reason.
I cannot address your main concern about the undesirable behavior, and I am afraid nobody can: only you know what behavior is desirable. You may provide (failing) test cases, but that would jeopardize on-topikness of the question.
Some random observation on the grammar follow:
You disallow an empty
statement_list, but you treatvar_declas a statement. It means thatwhile (foo)is invalid, but
while (foo)
let bar;is valid.
Does not make much sense for me.
The function argument list cannot be empty. Is it intentional?
I strongly recommend to factor the operators out. For example,
cmp_exp : cmp_exp cmp_op add_exp
| add_expand spell
cmp_opin a separate rule.It seems that
cond_exprule is incomplete. I'd expectcond_exp : logic_or_exp '?' cond_exp ':' cond_exp
| logic_or_expBesides, I have a feeling that the
cond_exp ':' cond_exppart is extremely hard to parse meaningfully. The grammar you refer toconditional_exp : logical_or_exp
| logical_or_exp '?' exp ':' conditional_exp
;segregates
expandconditional_expfor a reason.
edited Jan 19 at 2:12
answered Jan 19 at 1:08
vnp
36.6k12991
36.6k12991
Thanks for the great comments! The point about empty statement lists is good so I will fix that by allowing an empty block (as that's the only place statement_list is used. Thanks for the point on operators as well I might do that just to make my own life easier :)
â JamesMac
Jan 19 at 12:15
Function argument list can be empty unless I am making a mistake? there is a rule for func_decl to define a function with no arguments, and there is a rule for postfix_exp to call something without any arguments
â JamesMac
Jan 19 at 12:17
The cond_exp rule was wrong as well thanks, I'm not sure how that happened, perhaps I deleted a line by mistake when posting the question, because it's fine in my project! Parsing "cond_exp : cond_exp" hasn't been a problem at all for me, I have tested it very carefully; I can post the code that does this although i'm sure it's nothing special
â JamesMac
Jan 19 at 12:20
add a comment |Â
Thanks for the great comments! The point about empty statement lists is good so I will fix that by allowing an empty block (as that's the only place statement_list is used. Thanks for the point on operators as well I might do that just to make my own life easier :)
â JamesMac
Jan 19 at 12:15
Function argument list can be empty unless I am making a mistake? there is a rule for func_decl to define a function with no arguments, and there is a rule for postfix_exp to call something without any arguments
â JamesMac
Jan 19 at 12:17
The cond_exp rule was wrong as well thanks, I'm not sure how that happened, perhaps I deleted a line by mistake when posting the question, because it's fine in my project! Parsing "cond_exp : cond_exp" hasn't been a problem at all for me, I have tested it very carefully; I can post the code that does this although i'm sure it's nothing special
â JamesMac
Jan 19 at 12:20
Thanks for the great comments! The point about empty statement lists is good so I will fix that by allowing an empty block (as that's the only place statement_list is used. Thanks for the point on operators as well I might do that just to make my own life easier :)
â JamesMac
Jan 19 at 12:15
Thanks for the great comments! The point about empty statement lists is good so I will fix that by allowing an empty block (as that's the only place statement_list is used. Thanks for the point on operators as well I might do that just to make my own life easier :)
â JamesMac
Jan 19 at 12:15
Function argument list can be empty unless I am making a mistake? there is a rule for func_decl to define a function with no arguments, and there is a rule for postfix_exp to call something without any arguments
â JamesMac
Jan 19 at 12:17
Function argument list can be empty unless I am making a mistake? there is a rule for func_decl to define a function with no arguments, and there is a rule for postfix_exp to call something without any arguments
â JamesMac
Jan 19 at 12:17
The cond_exp rule was wrong as well thanks, I'm not sure how that happened, perhaps I deleted a line by mistake when posting the question, because it's fine in my project! Parsing "cond_exp : cond_exp" hasn't been a problem at all for me, I have tested it very carefully; I can post the code that does this although i'm sure it's nothing special
â JamesMac
Jan 19 at 12:20
The cond_exp rule was wrong as well thanks, I'm not sure how that happened, perhaps I deleted a line by mistake when posting the question, because it's fine in my project! Parsing "cond_exp : cond_exp" hasn't been a problem at all for me, I have tested it very carefully; I can post the code that does this although i'm sure it's nothing special
â JamesMac
Jan 19 at 12:20
add a comment |Â
2
What language is this grammar description in? Some generic BNF? Or does this serve as input to a parser generator tool?
â 200_success
Jan 19 at 2:56
I wrote this grammar myself just as a reference while working on the interpreter, as I wrote the parser myself by hand, not using yacc/antlr or any generators. So it might be using the wrong symbols or not be a recognisable structure, for which I can only apologise and hope the meaning is still clear
â JamesMac
Jan 19 at 12:10
This question is being discussed on meta
â Mast
Jan 19 at 20:48