这是一个简单的规则:
NAME : 'name1' | 'name2' | 'name3';
Run Code Online (Sandbox Code Playgroud)
是否可以使用包含字符串的数组动态地为此类规则提供替代方案?
需要为
表格的可能设计语言   实现COS aka MUMPS的语法突出显示
new (new,set,kill)
set kill=new
Run Code Online (Sandbox Code Playgroud)
其中:'new'和'set'是命令,也是变量
grammar cos;
Command_KILL            :( ('k'|'K') | ( ('k'|'K')('i'|'I')('l'|'L')('l'|'L') ) ); 
Command_NEW             :( ('n'|'N') | ( ('n'|'N')('e'|'E')('w'|'W') ) ); 
Command_SET             :( ('s'|'S') | ( ('s'|'S')('e'|'E')('t'|'T') ) );
INT : [0-9]+;
ID : [a-zA-Z][a-zA-Z0-9]*;
Space: ' ';
Equal: '=';
newCommand
    :   Command_NEW Space ID
    ;
setCommand
    :   Command_SET Space ID Space*  Equal Space* INT
    ; 
Run Code Online (Sandbox Code Playgroud)
我有一个问题,当ID像名字一样命令(NEW,SET等)
我怎么能找到以前的/左令牌词法
例如  
lexer grammar TLexer;
ID     : [a-zA-Z] [a-zA-Z0-9]*;
CARET  : '^';
RTN    : {someCond1}? CARET ID; // CARET not include this token
GLB    : {someCond2}? CARET ID; // CARET not include this token
Run Code Online (Sandbox Code Playgroud)
等等
我目前正在使用针对 C# 的 AnTLR4 创建语法,但在开发访问者时遇到问题。我找不到书中提到的 ParseTree 类。
在书中我们有:
LabeledExprLexer lexer = new LabeledExprLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
LabeledExprParser parser = new LabeledExprParser(tokens);
ParseTree tree = parser.prog(); // parse
but I can't see the equivalent C# code.
Run Code Online (Sandbox Code Playgroud)
你能帮忙吗?
在这个问题中,有人询问了ParseTreeANTLR4中java 类的C#等价物.这个答案对我来说很清楚,但我有一个相关的,先前的问题:哪个是等价的parser.prog()?
似乎整个处理从这一点开始,调用parser.prog(),我必须做一些非常错误的事情,因为我prog()在myGrammarParser课堂上找不到方法.我已经在github源代码中搜索了它的基类Parser,但是prog()这里也没有找到Method.
我做了一些猜测,以防方法有不同的名字,但没有运气.
我想我正在回到ANTLR3,因为我找到了一些针对C#的ANTLR3的实例.遗憾的是,要让它发挥作用是如此困难.
提前致谢.
我很遗憾再问一个关于相互左递归的问题,我觉得我的情况是独一无二的,或者至少我无法弄清楚它是否与其他人的语法联系起来.我对comp sci世界有点新鲜(我在java中自学,这是我的目标语言,现在是ANTLR4)所以如果可能的话请用layperson术语描述,而不是CS主要术语.
我正在编写一个需要代数和符号衍生物的程序,当然这需要对事物进行解析,然后对树进行操作,但我甚至不会担心这一点,因为我认为ANTLR4支持直接左递归,但是显然它不是以某种方式.在输出中,它一直告诉我,我的方法[表达式]是相互遗留的,显然是不允许的......?我的问题:
1)有人可以解释左递归/相互和直接左递归之间的区别,如果有的话?
2)解释我的语法中是什么导致了这种递归烦恼,以及如何解决它?而且我不确定这是否是主题:
3)人们说关于替代品和标签替代品的事情(我认为他们的意思是#label符号).那个有什么用?
grammar MathProcessor;
@header {package utils;}
END: ';';
EQUALS: '=';
SIN: 'sin(';
COS: 'cos(';
TAN: 'tan(';
SEC: 'sec(';
CSC: 'csc(';
COT: 'cot(';
LN: 'ln(';
EPOW: 'pow(';
RPAREN: '(';
LPAREN: ')';
EXP: '^';
MULT: '*';
DIV: '/';
ADD: '+';
SUBT: '-';
VAR: ('a'..'z'|'A'..'Z');
INT: ('0'..'9')+;
mathobj: ((equation|expression) END) EOF;
equation: (expression '=' expression);
expression: 
((RPAREN|SIN|COS|TAN|SEC|CSC|COT|LN|EPOW) expression (RPAREN)) #parenOps
| (expression EXP expression) #exponent
| (expression (MULT|DIV) expression) #multiplyDivide 
| (expression (ADD|SUBT) expression) #addSubtract
| (VAR|INT) #varInt …Run Code Online (Sandbox Code Playgroud) 我知道以前有人问过这个问题,但我还没有找到任何解决我的具体问题的方法。我将 Antlr4 与 C# 目标一起使用,并且我有以下词法分析器规则:
INT     : [0-9]+
        ;
LETTER  : [a-zA-Z_]+
        ;
WS      : [ \t\r\n\u000C]+ -> skip
        ;
LineComment
        : '#' ~[\r\n]* -> skip
        ;
Run Code Online (Sandbox Code Playgroud)
这些都是词法分析器规则,但是有很多解析器规则我不会在这里发布,因为我认为它们不相关。我遇到的问题是空格不会被跳过。当我在词法分析器运行我的输入后检查令牌流时,空格仍在那里,因此会导致错误。我使用的输入是比较基础的:
"fd 100"
Run Code Online (Sandbox Code Playgroud)
它解析完成,直到达到此解析器规则:
noSignFactor
        : ':' ident                 #NoSignFactorArg
        | integer                   #NoSignFactorInt
        | float                     #NoSignFactorFloat
        | BOOLEAN                   #NoSignFactorBool
        | '(' expr ')'              #NoSignFactorExpr
        | 'not' factor              #NoSignFactorNot
        ;
integer : INT                       #IntegerInt
        ;
Run Code Online (Sandbox Code Playgroud) 有没有办法让ANTLR4自动删除生成的解析树中的冗余节点?
更具体地说,我一直在试验GLSL的语法,并且由于规则转发需要自动处理运算符优先级,因此在解析树中最终会出现长线性的"表达式"序列.
大多数生成的树节点只是"转发到下一级优先级",因此不提供任何有用的语法信息 - 您只需要每个序列中的最后一个表达式节点(即规则转发停止的点)或者它成为具有多个子节点的实际树节点的点(即在源中遇到实际表达式)...
我希望有一种简单的方法来消除虚拟中间表达式节点 - 这种类型的结构必须在具有运算符优先级的任何语法中都是通用的.
语法的基本结构是从Khronos语言规范中获得的相当直接的克隆:
https://www.khronos.org/registry/gles/specs/3.1/es_spec_3.1.pdf
当我尝试生成监听器/访问者...对于我的语法我收到以下错误:ANTLR无法生成从4.5版开始的Javascript代码
有谁知道如何解决它?我仍然可以生成C#和Java代码.
我是ANTLR的新手。我刚刚发现,可以像这样在生产中标记每个替代品:
foo
    : a # aLabel
    | b # bLabel
    | // ...
    ;
Run Code Online (Sandbox Code Playgroud)
但是,我发现必须标记所有替代方案或不标记替代方案是令人不快的。最近,我只需要标记具有20个以上分支的产品中的2个替代品,最后我标记了每个其他替代品# stubLabel。有什么理由要全部或不加标签?