我在网络上尝试了很多示例,但找不到任何有效的示例。
因此,请提供一个如何使用 ANTLRInputStream 从文件中读取输入的工作示例
这样我就可以很容易地理解。
提前致谢。
采取这个虚拟的 antlr4 语法:
grammar testingGrammar;
@header{package gen;}
dsopt_rename: 'rename' (OLDN=ID '=' NEWN=ID)+;
ID: [a-zA-Z_];
Run Code Online (Sandbox Code Playgroud)
我的目标是java。我想得到两个列表:oldNames 和 newNames;可以这样做:
@Override
public DsOption visitDsopt_rename(Dsopt_renameContext ctx) {
LinkedList<String> oldNames = new LinkedList<String>();
LinkedList<String> newNames = new LinkedList<String>();
for (int i=0; i < ctx.ID().size(); ++i) {
LinkedList<String> rename = (i%2 == 1) ? oldNames : newNames;
rename.add(ctx.ID(i).getText());
}
return new DsOptRename(oldNames, newNames);
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢以下方法 - 也称为“第二种方法” - (如果它有效的话):
@Override
public DsOption visitDsopt_rename(Dsopt_renameContext ctx) {
LinkedList<String> oldNames = new LinkedList<String>();
LinkedList<String> newNames = new LinkedList<String>();
ctx.OLDN().forEach(e …Run Code Online (Sandbox Code Playgroud) 我想从ANTLR python 目标页面执行示例,但我不知道如何定义startRule()-Function 以将代码输入特定规则。有人可以举一个startRule()-Definition 的例子吗?
我不喜欢将 ANTLR 生成的文件与我的.g4语法和其他版本控制文档放在同一位置。我想将所有生成的文件放在一个单独的嵌套文件夹中,可以通过.gitignore. 到目前为止,我尝试的是<someFolder>在主文件夹内创建一个文件夹,然后从该文件夹内运行:
cd <someFolder>
antlr ../<grammarFile.g4>
Run Code Online (Sandbox Code Playgroud)
但是,它仍然会溢出父文件夹中的所有生成的文件。
PS这应该不重要,但我的环境是 macOS。
所以最近我想使用自定义语言创建一个基于浏览器的编辑monaco器antlr。我遵循了这个很棒的教程https://tomassetti.me/writing-a-browser-based-editor-using-monaco-and-antlr/。
Monaco 已经在按 ctrl + space 时给出了建议,但我想在monaco. 我怎样才能做到这一点?
我试图创建一个接受任何字符或数字或几乎任何东西的语法,只要它的长度等于1.
有检查长度的功能吗?
让我用一个例子更清楚地说明我的问题.我写了以下代码:
grammar first;
tokens {
SET = 'set';
VAL = 'val';
UND = 'und';
CON = 'con';
ON = 'on';
OFF = 'off';
}
@parser::members {
private boolean inbounds(Token t, int min, int max) {
int n = Integer.parseInt(t.getText());
return n >= min && n <= max;
}
}
parse : SET expr;
expr : VAL('u'('e')?)? String |
UND('e'('r'('l'('i'('n'('e')?)?)?)?)?)? (ON | OFF) |
CON('n'('e'('c'('t')?)?)?)? oneChar
;
CHAR : 'a'..'z';
DIGIT : '0'..'9';
String : (CHAR | DIGIT)+; …Run Code Online (Sandbox Code Playgroud) 我需要解析一个小的表达式语言(并且,或者,不是,parens改变优先级)所以选择了ANTLR来完成任务,我取得了很好的进展(ANTLRWorks非常适合新手).我在antlr网站上使用了一些Getting Starting引用,然后找到两篇完全适合我想要完成的内容的博客文章:
http://www.codeproject.com/KB/recipes/sota_expression_evaluator.aspx http://www.alittlemadness.com/2006/06/05/antlr-by-example-part-1-the-language
我遇到的问题是无论我输入什么输入我总是得到错误:
第1:29行输入'EOF'没有可行的选择
因此,作为我的故障排除的一部分,我决定尝试一种我知道很好的语法,并从第一个链接中找到的ECalc.g语法生成一个词法分析器/解析器.令我惊讶的是,在使用该语法时我遇到了同样的错误!我很生气.我对语法的唯一改变是让它生成Java代码并在@members部分中取出一些CSharp代码.
这是我的测试类:
public class ECalcTester {
private final static Logger logger = Logger.getLogger(ECalcTester.class);
public static void main(String[] args) {
BasicConfigurator.configure();
ECalcLexer lex = new ECalcLexer(new ANTLRStringStream("false || not (false and true)"));
Token token;
while (true) {
token = lex.nextToken();
if (token.getType() == Token.EOF) {
break;
}
System.out.println("Token: ‘" + token.getText() + "’");
}
CommonTokenStream tokens = new CommonTokenStream(lex);
lex.nextToken();
ECalcParser parser = new ECalcParser(tokens);
try {
logger.debug(parser.expression().getTree());
} catch (org.antlr.runtime.RecognitionException e) {
logger.error("Exception ", …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用ANTLR为使用C#代码生成的简单语言创建解析器.
我已成功地使用名为"rule"的非常简单的规则来生产MyLangLexer.cs和MyLangParser.cs.
问题是生成的方法rule()是私有的.
我想要的是使用ANTLR将字符串解析为AST.
谢谢,Ido.
有没有办法让ANTLR4自动删除生成的解析树中的冗余节点?
更具体地说,我一直在试验GLSL的语法,并且由于规则转发需要自动处理运算符优先级,因此在解析树中最终会出现长线性的"表达式"序列.
大多数生成的树节点只是"转发到下一级优先级",因此不提供任何有用的语法信息 - 您只需要每个序列中的最后一个表达式节点(即规则转发停止的点)或者它成为具有多个子节点的实际树节点的点(即在源中遇到实际表达式)...
我希望有一种简单的方法来消除虚拟中间表达式节点 - 这种类型的结构必须在具有运算符优先级的任何语法中都是通用的.
语法的基本结构是从Khronos语言规范中获得的相当直接的克隆:
https://www.khronos.org/registry/gles/specs/3.1/es_spec_3.1.pdf
我想将ANTLR4与Python 2.7结合使用,为此,我做了以下工作:
我antlr4-4.6-1使用sudo pacman -S antlr4。将软件包安装在Arch Linux上。
我写了一个MyGrammar.g4文件,并成功生成了Lexer和Parser Codeantlr4 -Dlanguage=Python2 MyGrammar.g4
现在执行例如生成的Lexer代码并python2 MyGrammarLexer.py导致错误ImportError: No module named antlr4。
可能是什么问题?仅供参考:我同时安装了Python2和Python3-我不知道这是否会造成任何麻烦。
antlr ×10
antlr4 ×5
antlr3 ×3
python ×2
autocomplete ×1
c# ×1
editor ×1
java ×1
parsing ×1
typescript ×1