grammar.lalrpop 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. use crate::ast::*;
  2. use crate::lexer::*;
  3. grammar<'input>(ast: &mut ASTArena);
  4. extern {
  5. type Location = usize;
  6. type Error = LexerError;
  7. enum Token<'input> {
  8. "<" => Token::LAngle,
  9. ">" => Token::RAngle,
  10. "(" => Token::LPar,
  11. ")" => Token::RPar,
  12. "{" => Token::LCurl,
  13. "}" => Token::RCurl,
  14. "|" => Token::Pipe,
  15. ":" => Token::Colon,
  16. "," => Token::Comma,
  17. ";" => Token::Semi,
  18. "." => Token::Dot,
  19. ".." => Token::DotDot,
  20. "=>" => Token::Arrow,
  21. ":=" => Token::Assn,
  22. "::=" => Token::LitAssn,
  23. "puts" => Token::Puts,
  24. "case" => Token::Case,
  25. "let" => Token::Let,
  26. "in" => Token::In,
  27. "var" => Token::Var(<&'input str>),
  28. "atom" => Token::Atom(<&'input str>),
  29. "num" => Token::Num(<i64>),
  30. "str" => Token::Str(<String>)
  31. }
  32. }
  33. pub Stmts: Vec<Stmt> = {
  34. <mut stmts:(<Stmt> ";")*> <stmt:Stmt?> => match stmt {
  35. None => stmts,
  36. Some(stmt) => {
  37. stmts.push(stmt);
  38. stmts
  39. }
  40. },
  41. };
  42. pub Stmt: Stmt = {
  43. "puts" <Expr> => Stmt::Puts(<>),
  44. <Name> ":=" <Expr> => Stmt::Assn(<>),
  45. <name:Name> "::=" <strs:(<"var">)*> =>
  46. Stmt::LitAssn(name, strs.iter().map(|x| x.to_string()).collect()),
  47. };
  48. pub Name: Name = {
  49. "var" => ast.add_string(<>),
  50. };
  51. pub Expr: Expr = {
  52. <mut ts:(<Choice> "|")*> <t:Choice> => {
  53. ts.push(t);
  54. Expr::Chc(ts)
  55. }
  56. };
  57. pub Choice: Choice = {
  58. <weight:"num"> ":" <value:Term> => Choice {
  59. weight: Some(weight),
  60. value
  61. },
  62. <value:Term> => Choice {
  63. weight: None,
  64. value
  65. }
  66. };
  67. pub Term: Expr = {
  68. (<Branch>)* => Expr::Cat(<>),
  69. };
  70. pub Branch: Expr = {
  71. <l:Branch> "." <r:Subbranch> => Expr::Ap(Box::new(l), Box::new(r)),
  72. <Subbranch> => <>,
  73. };
  74. pub Subbranch: Expr = {
  75. <l:Subbranch> ".." <r:Leaf> => Expr::Range(Box::new(l), Box::new(r)),
  76. <Leaf> => <>,
  77. }
  78. pub Leaf: Expr = {
  79. <Literal> => Expr::Lit(<>),
  80. <Name> => Expr::Var(<>),
  81. "<" <mut es:(<Expr> ",")*> <e:Expr> ">" => {
  82. es.push(e);
  83. Expr::Tup(es)
  84. },
  85. "let" <name:Name> ":=" <e1:Expr> "in" "{" <e2:Expr> "}" =>
  86. Expr::Let(name, Box::new(e1), Box::new(e2)),
  87. "{" <mut cs:(<Case> ";")*> <c:Case> "}" => {
  88. cs.push(c);
  89. Expr::Fun(cs)
  90. },
  91. "(" <e:Expr> ")" => e,
  92. };
  93. pub Case: Case = {
  94. <pat:Pat> "=>" <expr:Expr> => Case { pat, expr },
  95. };
  96. pub Pat: Pat = {
  97. <Literal> => Pat::Lit(<>),
  98. <Name> => Pat::Var(<>),
  99. "<" <mut ps:(<Pat> ",")*> <p:Pat> ">" => {
  100. ps.push(p);
  101. Pat::Tup(ps)
  102. },
  103. };
  104. pub Literal: Literal = {
  105. "num" => Literal::Num(<>),
  106. "str" => Literal::Str(<>),
  107. "atom" => Literal::Atom(ast.add_string(<>)),
  108. };