grammar: Remove Ignore
expression to avoid parsing ambiguity :'(
This commit is contained in:
parent
b1f90ca4e9
commit
0445598ae8
@ -15,14 +15,13 @@ Fn = "fn" Identifier Block ; (* TODO: params, return value*)
|
||||
|
||||
(* # Expressions *)
|
||||
(* expression *)
|
||||
Expr = Ignore ;
|
||||
Expr = Assign ;
|
||||
Block = '{' Expr '}' ;
|
||||
Group = '(' Expr? ')' ;
|
||||
Primary = Item | Identifier | Literal
|
||||
| Block | Group | Branch ;
|
||||
|
||||
(* expression::math *)
|
||||
Ignore = Assign (IgnoreOp Assign )* ;
|
||||
Assign = Compare (AssignOp Compare)* ;
|
||||
Compare = Range (CompareOp Range )* ;
|
||||
Range = Logic (RangeOp Logic )* ;
|
||||
@ -34,7 +33,6 @@ Factor = Unary (FactorOp Unary )* ;
|
||||
Unary = (UnaryOp)* Primary ;
|
||||
|
||||
(* expression::math::operator *)
|
||||
IgnoreOp = ';' ;
|
||||
AssignOp = '=' | "+=" | "-=" | "*=" | "/=" |
|
||||
"&=" | "|=" | "^=" |"<<=" |">>=" ;
|
||||
CompareOp = '<' | "<=" | "==" | "!=" | ">=" | '>' ;
|
||||
|
@ -270,18 +270,16 @@ pub mod expression {
|
||||
r" | 8 | Assign |", r"`*=`, `/=`, `%=`, `+=`, `-=`, ",//|
|
||||
/* | | |*/ r"`&=`, <code>|=</code>, ", //|
|
||||
/* | | |*/ r"`^=`, `<<=`, `>>=`", r"| Right to Left")]
|
||||
//! | 9 | Ignore | `;` |
|
||||
//!
|
||||
//! <!-- Note: '|' == '|' /-->
|
||||
//!
|
||||
//! ## Syntax
|
||||
//! ```ignore
|
||||
//! /* All precedence levels other than Unary fold into Binary */
|
||||
//! Ignore := Assign (CompareOp Assign )*
|
||||
//! Assign := Compare (IgnoreOp Compare)*
|
||||
//! Compare := Logic (AssignOp Logic )*
|
||||
//! Assign := Compare (AssignOp Compare)*
|
||||
//! Compare := Logic (CompareOp Logic )*
|
||||
//! Logic := Bitwise (LogicOp Bitwise)*
|
||||
//! Bitwise := Shift (BitOp Shift )*
|
||||
//! Bitwise := Shift (BitwiseOp Shift )*
|
||||
//! Shift := Term (ShiftOp Term )*
|
||||
//! Term := Factor (TermOp Factor )*
|
||||
//! Factor := Unary (FactorOp Unary )*
|
||||
@ -324,7 +322,7 @@ pub mod expression {
|
||||
r"| 7 |", r"`*=`, `/=`, `%=`, `+=`, `-=`, ",//|
|
||||
/* | |*/ r"`&=`, <code>|=</code>, ", //|
|
||||
/* | |*/ r"`^=`, `<<=`, `>>=`, `=`", r"| Left to Right")]
|
||||
//! | 8 | `;` |
|
||||
//! | 8 | `,` |
|
||||
|
||||
/// Operators which take a single argument
|
||||
///
|
||||
@ -430,9 +428,6 @@ pub mod expression {
|
||||
ShlAssign,
|
||||
/// `>>=`: Right Shift In-place Assignment
|
||||
ShrAssign,
|
||||
// Ignorance operators
|
||||
/// `;`: Ignore
|
||||
Ignore,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -341,7 +341,7 @@ impl Parser {
|
||||
impl Parser {
|
||||
fn expr(&mut self) -> PResult<expression::Expr> {
|
||||
use expression::Expr;
|
||||
Ok(Expr { ignore: self.ignore()? })
|
||||
Ok(Expr { ignore: self.assign()? })
|
||||
}
|
||||
fn block(&mut self) -> PResult<expression::Block> {
|
||||
self.delimited(Type::LCurly, |p| p.expr(), Type::RCurly)
|
||||
@ -408,8 +408,7 @@ macro binary ($($f:ident = $a:ident, $b:ident);*$(;)?) {$(
|
||||
/// # [Arithmetic and Logical Subexpressions](math)
|
||||
impl Parser {
|
||||
binary! {
|
||||
//name operands operators
|
||||
ignore = assign, ignore_op;
|
||||
// name operands operators
|
||||
assign = compare, assign_op;
|
||||
compare = range, compare_op;
|
||||
range = logic, range_op;
|
||||
@ -491,10 +490,6 @@ impl Parser {
|
||||
Type::LtLtEq => ShlAssign,
|
||||
Type::GtGtEq => ShrAssign,
|
||||
}
|
||||
ignore_op: {
|
||||
Type::Semi => Ignore,
|
||||
}
|
||||
|
||||
}
|
||||
/// Parse a [unary operator](operator::Unary)
|
||||
fn unary_op(&mut self) -> PResult<operator::Unary> {
|
||||
|
@ -147,7 +147,6 @@ impl<W: Write> Visitor<IOResult<()>> for Printer<W> {
|
||||
Binary::BitXorAssign => "^=",
|
||||
Binary::ShlAssign => "<<=",
|
||||
Binary::ShrAssign => ">>=",
|
||||
Binary::Ignore => ";",
|
||||
})
|
||||
}
|
||||
fn visit_unary_op(&mut self, op: &operator::Unary) -> IOResult<()> {
|
||||
|
Loading…
Reference in New Issue
Block a user