質問するログイン新規登録

質問編集履歴

3

hh

2019/12/14 04:53

投稿

light180
light180

スコア161

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,7 @@
1
1
  Parsletライブラリを使用してPEGを記述しparserを作っていたのですが、Parslet::Parsefaildというraiseエラーが起きてしまいます。
2
2
  どなたか、ご教示いただけると、嬉しいです。
3
+
4
+ > 追記、解決しました。@asmさん、ありがとうございます。
3
5
  ```Error
4
6
  Traceback (most recent call last):
5
7
  2: from parser.rb:66:in `<main>'
@@ -8,6 +10,14 @@
8
10
  ' at line 1 char 1.
9
11
  ```
10
12
 
13
+ 以下、新しいエラーです。
14
+ ```
15
+ Traceback (most recent call last):
16
+ 2: from temp.rb:64:in `<main>'
17
+ 1: from /Library/Ruby/Gems/2.6.0/gems/parslet-1.8.2/lib/parslet/atoms/base.rb:49:in `parse'
18
+ /Library/Ruby/Gems/2.6.0/gems/parslet-1.8.2/lib/parslet/cause.rb:70:in `raise': Extra input after last repetition at line 2 char 1. (Parslet::ParseFailed)
19
+ ```
20
+
11
21
  ```parser.rb
12
22
  require 'parslet'
13
23
  class NumericParser < Parslet::Parser
@@ -31,7 +41,7 @@
31
41
  }
32
42
 
33
43
  rule(:integer) {
34
- match("[0-9]")
44
+ match("[0-9]").repeat(1)
35
45
  }
36
46
 
37
47
  rule(:code) {
@@ -43,7 +53,7 @@
43
53
  }
44
54
 
45
55
  rule(:func) {
46
- match("#{idens.join(" | ")}") >> block
56
+ idens.map{|f| str(f)}.inject(:|) >> block
47
57
  }
48
58
 
49
59
  rule(:block){

2

追加

2019/12/14 04:53

投稿

light180
light180

スコア161

title CHANGED
File without changes
body CHANGED
@@ -20,7 +20,7 @@
20
20
  rule(:returns){ return_mark.repeat(1) }
21
21
  rule(:return?){ returns.maybe }
22
22
  rule(:sprt?){ (return_mark | space).repeat(0)}
23
- rule(:chars){ str("!") | str("#") | str("$") | str("%") | str("&") | str("") | str("(") | str(")") | str("*") | str("+") | str(",") | str("-") | str(".") | str("/") | str("0") | match("[0-9]") | str(":") | str(";") | str("<") | str("=") | str(">") | str("?") | str("@") | match("[A-Z]") | str("[") | str("\") | str("]") | str("^") | str("_") | str("`") | match("[a-z]") | str("{") | str("|") | str("}") | str("~") | str("\\"") }
23
+ rule(:chars){ str("a") | str("b") | str("c") | str("d") | str("e") | str("f") | str("g") | str("h") | str("i") | str("j") | str("k") | str("l") | str("m") | str("n") | str("o") | str("p") | str("q") | str("r") | str("s") | str("t") | str("u") | str("v") | str("w") | str("x") | str("y") | str("z") | str("A") | str("B") | str("C") | str("D") | str("E") | str("F") | str("G") | str("H") | str("I") | str("J") | str("K") | str("L") | str("M") | str("N") | str("O") | str("P") | str("Q") | str("R") | str("S") | str("T") | str("U") | str("V") | str("W") | str("X") | str("Y") | str("Z") | str("0") | str("1") | str("2") | str("3") | str("4") | str("5") | str("6") | str("7") | str("8") | str("9") | str(" ") | str("!") | str("\\"") | str("#") | str("$") | str("%") | str("&") | str("\'") | str("(") | str(")") | str("-") | str("^") | str("@") | str("[") | str(";") | str(":") | str("]") | str(",") | str(".") | str("/") | str("\\") | str("=") | str("~") | str("|") | str("`") | str("{") | str("+") | str("*") | str("}") | str("<") | str(">") | str("?") | str("_") | str("\n") | str("\s") | str("\t") }
24
24
 
25
25
  rule(:string) {
26
26
  str("\"") >> chars.repeat >> str("\"")
@@ -43,7 +43,7 @@
43
43
  }
44
44
 
45
45
  rule(:func) {
46
- match("#{idens.join("|")}") >> block
46
+ match("#{idens.join(" | ")}") >> block
47
47
  }
48
48
 
49
49
  rule(:block){
@@ -72,5 +72,24 @@
72
72
  code.push(line)
73
73
  end
74
74
  f.close
75
- NumericParser.new.parse(code.join("\n"))
75
+ NumericParser.new.parse(code.join("\n")+"\n")
76
+ ```
77
+
78
+ テストデータです。
79
+ ```
80
+ 123
81
+ ```
82
+
83
+ ```
84
+ print(123)
85
+ ```
86
+
87
+ ```
88
+ print("aiueo")
89
+ ```
90
+
91
+ ```
92
+ print{
93
+ print("aiueo")
94
+ }
76
95
  ```

1

修正

2019/12/14 03:50

投稿

light180
light180

スコア161

title CHANGED
File without changes
body CHANGED
@@ -39,7 +39,7 @@
39
39
  }
40
40
 
41
41
  rule(:line) {
42
- func | assign | value
42
+ func | assign | value | sprt?
43
43
  }
44
44
 
45
45
  rule(:func) {