在10.4节中,如果要在第一个解析错误时退出,则最终ANTLR引用会指示您覆盖mismatch()和recoverFromMismatchedSet().但是,至少在ANTLR 3.2中,似乎没有mismatch()方法,并且recoverFromMismatchedSet()文档说它是"当前未使用".因此,自该书出版以来,情况似乎发生了变化.
我应该做什么而不是退出ANTLR 3.2中的第一个解析错误?
为了让我的.sbclrc文件在我使用的两台计算机上运行,我想要一种从sbcl中获取主机名和/或操作系统的方法.我知道我可以设置然后查找环境变量,但有更直接的方法吗?
更新
我将问题改为引用普通的lisp,因为Ken的答案并不是特定于sbcl.
是否有用于创建Excel电子表格的通用lisp库?我更喜欢它输出一种XML格式.
更新:
要添加更多上下文,从常见的lisp创建一个csv文件非常简单,这就是我现在正在做的事情.
在XML电子表格格式非常简单,并且有可以很容易地输出任意XML的Common Lisp库,所以我自己的滚动是很容易的,但如果事情已经存在缓和的过程中,我宁愿.
我正在使用antlr 3.2.我有一个由原子(字符"0"或"1")组成的简单语法,以及一个将逗号分隔的列表汇总到列表中的规则.
当我输入"00"作为输入时,我没有收到错误,这让我感到惊讶,因为这不应该是有效的输入:
C:\Users\dan\workspace\antlrtest\test>java -cp antlr-3.2.jar org.antlr.Tool Test.g
C:\Users\dan\workspace\antlrtest\test>javac -cp antlr-3.2.jar *.java
C:\Users\dan\workspace\antlrtest\test>java -cp .;antlr-3.2.jar TestParser
[0]
Run Code Online (Sandbox Code Playgroud)
在这种情况下如何强制生成错误?这特别令人费解,因为当我在ANTLRWorks中使用此输入的解释器时,它确实显示NoViableAltException.
我发现,如果我将语法更改为要求,例如,结尾处有分号,则会生成错误,但我正在处理的实际语法中无法使用该解决方案.
这是语法,它是自包含且可运行的:
grammar Test;
@parser::members {
public static void main(String[] args) throws Exception {
String text = "00";
ANTLRStringStream in = new ANTLRStringStream(text);
TestLexer lexer = new TestLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
System.out.println(new TestParser(tokens).mainRule());
}
}
mainRule returns [List<String> words]
@init{$words = new ArrayList<String>();}
: w=atom {$words.add($w.text);} (',' w=atom {$words.add($w.text);} )*
;
atom: '0' | '1';
WS …Run Code Online (Sandbox Code Playgroud) 在C,我想一个转换signed char到int,没有符号扩展.因此,如果signed char是0xFF,int那么也将是0xFF.简单地转换为int是行不通的; 结果将是0xFFFFFFFF(在32位机器上).
这似乎有效(并且已经非常简单):
int convert(signed char sc) {
return 0xFF & (int) sc;
}
Run Code Online (Sandbox Code Playgroud)
但是有更简单或更惯用的方式吗?
编辑:固定功能
好吧,我有以下功能
y=sin(x)^2 + [(10+2x+x^2) / (5+2x^2)]
Run Code Online (Sandbox Code Playgroud)
我需要在y = -2到y = 2的区间绘制它,那我该如何设置呢?
我在matlab中做到了这一点
>> y = sin(x).^2 + (10 + 2*x + x.^2)/(5+2*x.^2)
>> x = -2:0.01:2;
Run Code Online (Sandbox Code Playgroud)
这是正确的设置吗?或者我做错了什么