Tatsu 文末不停
Tatsu no stopping at end of text
我试图在 Tatsu 中向 DSL 语法添加一些简单的错误处理。我写了一个简单的语法,将输入解析为数字或错误。
@@grammar :: Nums
start = wordlist $ ;
wordlist = {word eol}+ ;
eol = ':' ;
word
=
| num:num # Number.
| err:err # Not a number, error.
| eol:eol # Blank line.
;
num
=
| sci:sci # Scientific 'e' notation
| float:float # Normal real number notation
| int:int # Integer
;
int = /[-+]?\d+\.?/ ;
float = /[-+]?\d*\.\d+/ ;
sci = /([+-]?\d*\.?\d+[Ee][+-]?\d+)|(^[+-]?\d+\.?\d*[Ee][+-]?\d+)/ ;
err = ->&eol ;
输入看起来像:
123:2.3:-1。:错误:-.0123:-2.1e-2:+1.2e+3:
通过跟踪,我可以看到它正确地解析了所有输入。当它走到尽头时,它似乎在无限循环中继续解析。从最后一个数字到循环开始,输出如下:
↙word↙wordlist↙start ~1:44
+1.2e+3 :
↙num↙word↙wordlist↙start ~1:45
+1.2e+3 :
↙sci↙num↙word↙wordlist↙start ~1:45
+1.2e+3 :
≡'+1.2e+3' /([+-]?\d*\.?\d+[Ee][+-]?\d+)|(^[+-]?\d+\.?\d*[Ee][+-]?\d+)/
:
≡sci↙num↙word↙wordlist↙start ~1:52
:
≡num↙word↙wordlist↙start ~1:52
:
≡word↙wordlist↙start ~1:52
:
↙eol↙wordlist↙start ~1:52
:
≡':'
≡eol↙wordlist↙start ~1:54
↙word↙wordlist↙start ~1:54
↙num↙word↙wordlist↙start
↙sci↙num↙word↙wordlist↙start
≢'' /([+-]?\d*\.?\d+[Ee][+-]?\d+)|(^[+-]?\d+\.?\d*[Ee][+-]?\d+)/
↙float↙num↙word↙wordlist↙start
≢'' /[-+]?\d*\.\d+/
↙int↙num↙word↙wordlist↙start
≢'' /[-+]?\d+\.?/
≢num↙word↙wordlist↙start
↙err↙word↙wordlist↙start
↙eol↙err↙word↙wordlist↙start
≢':'
≢eol↙err↙word↙wordlist↙start
↙eol↙err↙word↙wordlist↙start
≢eol↙err↙word↙wordlist↙start
:
:
:
我这辈子都弄不明白为什么它不停下来。我什至不确定它试图解析什么。有人可以帮忙吗?
谢谢!
这不是 TatSu 的问题。给定的语法不解析所需的语言。你到处都是 eol
。
您可以尝试这样的操作:
wordlist = (eol).{word} $;
eol = ':' ;
word
=
| num:num # Number.
| err:err # Not a number, error.
;
err = ->&(eol|$) ;
更清晰的版本可能是:
wordlist = ':'.{word} $;
word
=
| num:num # Number.
| err:err # Not a number, error.
;
err = ->&(':'|$) ;
顺便说一句,非常很好使用->&
作为恢复规则!
我试图在 Tatsu 中向 DSL 语法添加一些简单的错误处理。我写了一个简单的语法,将输入解析为数字或错误。
@@grammar :: Nums
start = wordlist $ ;
wordlist = {word eol}+ ;
eol = ':' ;
word
=
| num:num # Number.
| err:err # Not a number, error.
| eol:eol # Blank line.
;
num
=
| sci:sci # Scientific 'e' notation
| float:float # Normal real number notation
| int:int # Integer
;
int = /[-+]?\d+\.?/ ;
float = /[-+]?\d*\.\d+/ ;
sci = /([+-]?\d*\.?\d+[Ee][+-]?\d+)|(^[+-]?\d+\.?\d*[Ee][+-]?\d+)/ ;
err = ->&eol ;
输入看起来像:
123:2.3:-1。:错误:-.0123:-2.1e-2:+1.2e+3:
通过跟踪,我可以看到它正确地解析了所有输入。当它走到尽头时,它似乎在无限循环中继续解析。从最后一个数字到循环开始,输出如下:
↙word↙wordlist↙start ~1:44
+1.2e+3 :
↙num↙word↙wordlist↙start ~1:45
+1.2e+3 :
↙sci↙num↙word↙wordlist↙start ~1:45
+1.2e+3 :
≡'+1.2e+3' /([+-]?\d*\.?\d+[Ee][+-]?\d+)|(^[+-]?\d+\.?\d*[Ee][+-]?\d+)/
:
≡sci↙num↙word↙wordlist↙start ~1:52
:
≡num↙word↙wordlist↙start ~1:52
:
≡word↙wordlist↙start ~1:52
:
↙eol↙wordlist↙start ~1:52
:
≡':'
≡eol↙wordlist↙start ~1:54
↙word↙wordlist↙start ~1:54
↙num↙word↙wordlist↙start
↙sci↙num↙word↙wordlist↙start
≢'' /([+-]?\d*\.?\d+[Ee][+-]?\d+)|(^[+-]?\d+\.?\d*[Ee][+-]?\d+)/
↙float↙num↙word↙wordlist↙start
≢'' /[-+]?\d*\.\d+/
↙int↙num↙word↙wordlist↙start
≢'' /[-+]?\d+\.?/
≢num↙word↙wordlist↙start
↙err↙word↙wordlist↙start
↙eol↙err↙word↙wordlist↙start
≢':'
≢eol↙err↙word↙wordlist↙start
↙eol↙err↙word↙wordlist↙start
≢eol↙err↙word↙wordlist↙start
:
:
:
我这辈子都弄不明白为什么它不停下来。我什至不确定它试图解析什么。有人可以帮忙吗?
谢谢!
这不是 TatSu 的问题。给定的语法不解析所需的语言。你到处都是 eol
。
您可以尝试这样的操作:
wordlist = (eol).{word} $;
eol = ':' ;
word
=
| num:num # Number.
| err:err # Not a number, error.
;
err = ->&(eol|$) ;
更清晰的版本可能是:
wordlist = ':'.{word} $;
word
=
| num:num # Number.
| err:err # Not a number, error.
;
err = ->&(':'|$) ;
顺便说一句,非常很好使用->&
作为恢复规则!