fork download
  1. using Nemerle;
  2. using Nemerle.Collections;
  3. using Nemerle.Text;
  4. using Nemerle.Utility;
  5. using Nemerle.Peg;
  6. using Nemerle.Macros;
  7.  
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11.  
  12. namespace PegParser
  13. {
  14.  
  15. public variant TaplAst
  16. {
  17. | Data { data : string }
  18. | Group { data : TaplAst.Sequence }
  19. | Sequence { words : List[TaplAst] }
  20. | UnaryOp { op : string; arg: TaplAst }
  21. | IfElse { cond : TaplAst; arg1: TaplAst; arg2: TaplAst }
  22. }
  23.  
  24. [PegGrammar(Option = EmitDebugSources, ast,
  25. grammar
  26. {
  27. s = ' '*;
  28. const = ['0'..'9']+ / "false" / "true";
  29. unaries = "succ" / "pred" / "iszero";
  30. unary : TaplAst = unaries s ast;
  31. ifelse : TaplAst = "if" s ast "then" s ast "else" s ast;
  32. data : TaplAst = const s;
  33. word : TaplAst = data / group / ifelse;
  34. group : TaplAst = '(' s ast ')' s;
  35. ast : TaplAst.Sequence = word+;
  36. })]
  37. class TaplParser
  38. {
  39.  
  40. private data(arg : NToken, _ : NToken) : TaplAst
  41. {
  42. TaplAst.Data(GetText(arg))
  43. }
  44.  
  45. private unary(op : NToken, _ : NToken, arg : TaplAst.Sequence) : TaplAst
  46. {
  47. TaplAst.UnaryOp(GetText(op), arg)
  48. }
  49.  
  50. private ifelse(_ : NToken, _ : NToken, cond : TaplAst.Sequence,
  51. _ : NToken, _ : NToken, arg1 : TaplAst.Sequence,
  52. _ : NToken, _ : NToken, arg2 : TaplAst.Sequence) : TaplAst
  53. {
  54. TaplAst.IfElse(cond,arg1,arg2);
  55. }
  56.  
  57. private word(arg : TaplAst) : TaplAst
  58. {
  59. arg
  60. }
  61.  
  62. private group(_ : NToken, _ : NToken, ast : TaplAst.Sequence, _ : NToken, _ : NToken) : TaplAst
  63. {
  64. TaplAst.Group(ast)
  65. }
  66.  
  67. private ast(data : List[TaplAst]) : TaplAst.Sequence
  68. {
  69. TaplAst.Sequence(data)
  70. }
  71. }
  72.  
  73. module Program
  74. {
  75. Main() : void
  76. {
  77. def myParser = TaplParser();
  78. def myText = "if false then 0 else 1";
  79. def (mpos, mast) = myParser.TryParse(myText);
  80. WriteLine(mpos);
  81. WriteLine(mast);
  82. }
  83. }
  84.  
  85. }
  86.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty