首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tatsu禁止在文本结尾处停留

Tatsu禁止在文本结尾处停留
EN

Stack Overflow用户
提问于 2021-07-16 20:49:35
回答 1查看 65关注 0票数 1

我试图向Tatsu中的DSL语法添加一些简单的错误处理。我写了一个简单的语法,把输入解析成数字或错误。

代码语言:javascript
复制
@@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:

通过跟踪,我可以看到它正确地解析了所有的输入。当它结束时,它似乎在无限循环中继续进行解析。从最后一个数字到循环的开始,输出如下:

代码语言:javascript
复制
↙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 
   :
   :
   :

为了我的生命,我弄不明白为什么它不停止。我甚至不知道它想要解析什么。有人能帮忙吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-17 22:10:26

这不是TatSu问题。给定的语法不能解析所需的语言。你的eol到处都是。

你可以试试这样的东西:

代码语言:javascript
复制
wordlist = (eol).{word} $;

eol = ':' ;

word
  = 
  | num:num     # Number.
  | err:err     # Not a number, error.
  ;

err = ->&(eol|$) ;

更明确的版本可能是:

代码语言:javascript
复制
wordlist = ':'.{word} $;

word
  = 
  | num:num     # Number.
  | err:err     # Not a number, error.
  ;

err = ->&(':'|$) ;

顺便说一句,非常好地使用->&作为恢复规则!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68415112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档