我有一个Ruby脚本,使用字符串插值来构建错误消息.
p "#{vName} is not a defined variable" => 'xxx is not a defined variable'
Run Code Online (Sandbox Code Playgroud)
另一位程序员通过并尝试将字符串文字外部化为单独的配置文件.当然,他没有得到替代.
p err_string_from_config => '#{vName} is not a defined variable'
Run Code Online (Sandbox Code Playgroud)
我环顾四周,但没有比转换为sprintf字符串和使用printf更好的方法.
有没有人知道如何让#{}替换处理Ruby脚本中不是双引号文字的字符串?
ANTLR用法的推荐模式是让Parser构造一个抽象语法树,然后构建Tree walker(AKA树语法)来处理它们.
我试图深入了解为什么我的树语法不起作用,并且喜欢使用ANTLRWorks的调试器,就像我将它用于解析器本身一样.解析器的输入是"源代码",但树解析器的输入是解析器的AST结果.我不知道如何使其可用作测试树语法的输入.
目前尚不清楚是否有办法在ANTLRWorks中测试树语法.如果可以做到,那么正确的方向指针将非常受欢迎.
我正在 ANTLR4 中重新实现现有的 DSL。现有的源代码主体有一些非常大的表达式。ALL(*) 逻辑中的递归似乎意味着我可以解析的表达式有多大限制。
示例语法:(刚好足以重现这里的错误错误)
grammar A4Test;
fragment DIGIT : [0-9];
fragment ALPHA : [a-zA-Z];
WS : [ \t\r\n\u000D'] {skip();};
ID : ALPHA (ALPHA|DIGIT)*;
NUMBER : '-'?(DIGIT+|(DIGIT*'.'DIGIT+));
e : expr;
expr : '(' expr ')'
| expr 'OR' expr
| expr 'AND' expr
| ID
| NUMBER
;
Run Code Online (Sandbox Code Playgroud)
样本输入:
V0 AND 0 OR
V1 AND 1 OR
... (MANY rows elided)
V3999 AND 3999 OR
V4000 AND 4000
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) …Run Code Online (Sandbox Code Playgroud)