Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

语法规则错误:在一个标识符出现后所有跟随表达式成为 CallEasy 参数 #4

Closed
duangsuse opened this issue May 9, 2018 · 10 comments
Assignees
Labels
bug Something isn't working help wanted Extra attention is needed syntax Lite syntax

Comments

@duangsuse
Copy link
Collaborator

#2 (comment)

目前发现了规则有一个问题:

CallEasy 会把之后所有的 expression 都当成参数:

System.out.println getb() a b c
#                                      ^ 会被当成 getb 的参数 
System.b 1 2 3 a(1) 2
#                              ^ 应该是 System.b ... 的参数,却变成了 a 的参数,而 a (1) 2 被解析为 CallEasy

a() 1 2 3

目前认为原来正确的设计是 getb() 使用了 () 来限制参数的范围,所以不会有问题
但是实际上 a() 被当成了 Call,不过这个没什么的

@duangsuse duangsuse self-assigned this May 9, 2018
@duangsuse duangsuse added bug Something isn't working syntax Lite syntax labels May 9, 2018
@duangsuse
Copy link
Collaborator Author

2018-05-09 18-25-06

临时修复方案,在测试其他问题

@duangsuse
Copy link
Collaborator Author

duangsuse commented May 9, 2018

) 限制参数列表末尾的功能依然没有发挥作用

@duangsuse
Copy link
Collaborator Author

duangsuse commented May 9, 2018

[] 也一样会把所有之后的都认为是列表的一员...

不是,上次这种情况是 CallEasy 规则什么的错了,想办法解决 ( 不能匹配上 Call 的问题

@duangsuse
Copy link
Collaborator Author

duangsuse commented May 9, 2018

目前的修复会导致问题

    | Call ~"" ExpList      -- callEasy // added a ~""
    | identifier ~"="       -- justIdentifier

也是因为 duangsuse 还没来得及彻底分析和理解 PEG 的问题
因为 duangsuse 并不理解递归,作为 或许需要脑子 的人我可能需要一个有脑子的人的帮助
已知 bug:

System.err.println a() b c # 正常解析
System.out.a(1, b(1),  [a + 2 + 2], 2) # OK
System.out.a 1, b(1),  [a + 2 + 2], 2 # error!

欢迎理解这方面姿势的 dalao 来帮助彻底解决此问题

在这之前

此 bug 会被当作 feature:让用户认为开发者是有强迫症的

因为 duangsuse 允许你完全使用 C 风格的调用和 Bash 风格的调用
而不允许你混合使用,所以如果混合出问题他会告诉你应该这样(迫真)

System.out.a 1, b(1),  [a + 2 + 2], 2
System.out.a 1 b(1)  [a + 2 + 2, 1] 2
# 之前有过一个可以正常解析如下的修改我忘记了,算(貌似)
System.out.a 1, b 1,  [a + 2 + 2, 1] 2

duangsuse 在被别人识破其实对解析器算法和规则之间的关系 一无所知 之前会把这当作 「强迫你使用优雅语法」的特性 👎

@duangsuse
Copy link
Collaborator Author

☝️ 其实这不是唯一一个我还不满意的问题,
(这个问题修的也就是我比较尴尬了)
和 brace_block 支持换行和 table 支持无 key 的项目一样

@duangsuse duangsuse added the help wanted Extra attention is needed label May 9, 2018
@duangsuse
Copy link
Collaborator Author

这个修改只是把一个一定要加上 , 要不然错了都不提醒的改成的一定要是整个 callEasy 里的都是使用空格切分或逗号切分的
这个修复我真的不清楚到底要不要,因为如果不要这个修复只是在调用参数内部加上 , 也可以解决
还是要吧,毕竟 System.out.print a() 这种是必须的
a() do end (这是如果不加上那个 buggy patch 被迫的 「feature」) 的价值高
(后者本来就应该使用 a do end),所以这个强迫症 bug 还勉强

@duangsuse
Copy link
Collaborator Author

对于日常使用不会有什么影响,因为只有 callEasy 里有至少一个 identifier 的时候才会出现,而且前提是
callEasy 里不是全都在使用 , 或空格切分

@duangsuse
Copy link
Collaborator Author

!!! 这个修复有 bug !!! 会导致 callEasy 其实完全不能用,我还是在这里等 dalao 或者我有水平处理这个问题吧

@duangsuse
Copy link
Collaborator Author

(duangsuse: 如果一但参数有 identifier 就会有 bug, 你们还是乖乖使用 C 风格的调用吧...)

@duangsuse
Copy link
Collaborator Author

duangsuse commented May 9, 2018

(好吧,其实我现在才知道, Ruby 她也不支持这种清奇的语法)
Ruby 和 Lua 一样,只允许一个参数,要不然就必须 comma,而 Lite 目前的语法就能实现这个(已经修复 System.out.print a, b(),c 的问题)

因此我决定规定 Lite 的 callEasy 只允许使用 1 个参数(允许添加不会出 bug 的 block)或者使用逗号分割参数列表
那么问题解决了 🎉 😋

see ANTLR Ruby-like parser Corundum
https://github.com/antlr/grammars-v4/blob/master/ruby/Corundum.g4#L103

🌚

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working help wanted Extra attention is needed syntax Lite syntax
Projects
None yet
Development

No branches or pull requests

1 participant