因此,我正在使用AntlrWorks2.1在ANTLR4中研究一个组合语法。我有lexer规则identifier
和block
,它们不被识别为已定义的lexer规则,但仅在最后定义的解析器规则中。在这些规则后面添加一个文字将删除(或隐藏)这些错误。
我的语法末尾有错误(斜体标记抛出错误):
grammar GCombined;
options { language = Cpp; }
@lexer::namespace{AntlrTest01}
@parser::namespace{AntlrTest01}
/* First Lexer Stage */
Bit: '0' | '1';
Digit : '0'..'9';
ODigit: '0'..'7';
XDigit: '0'..'f';
Letter: ('a'..'z') | ('A'..'Z');
Symbol: '|'
| '-'
| '!'
| '#'
| '$'
| '%'
| '&'
| '('
| ')'
| '*'
| '+'
| ','
| '-'
| '.'
| '/'
| ':'
| ';'
| '<'
| '='
| '>'
| '?'
| '@'
| '['
| ']'
| '^'
| '_'
| '`'
| '{'
| '|'
| '}'
| '~';
WSpace: ( ' '
| '\t'
| '\r'
| '\n'
| '\c'
| '\0'
| '\u000C'
)+ -> skip;
DNumber: Digit+;
ONumber: '0o' Digit+;
XNumber: '0x' Digit;
Integer: DNumber
| ONumber
| XNumber;
Float: DNumber '.' DNumber;
Character: Letter
| Digit
| Symbol
| WSpace;
String: Character+;
Literal: '"' String '"';
Boolean: 'true' | 'false';
/* Second Lexer Stage */
Number: Integer | Float;
Identifier: Letter (Letter | Digit | '_')+;
Keyword: Letter+;
Operator: '+'
| '-'
| '*'
| '/'
| '%'
| '=='
| '!='
| '>'
| '<'
| '>='
| '<='
| '&&'
| '||'
| '^'
| '&'
| '|'
| '<<'
| '>>'
| '~' ;
Expression: (Operator | Identifier)
'(' (Identifier | Number)+ ')';
Parameter: Identifier
| Expression
| Number;
Statement: Keyword '(' Parameter+ ')';
Block: '{' Statement+ '}';
/* Third Lexer Stage */
Add: '+';
Sub: '-';
Mlt: '*';
Div: '/';
Mod: '%';
Mathop: Add | Sub | Mlt | Div | Mod;
Deq: '==';
Neq: '!=';
Gtr: '>';
Lss: '<';
Geq: '>=';
Leq: '<=';
Condop: Deq | Neq | Gtr | Lss | Geq | Leq;
And: '&&';
Or: '||';
Xor: '^';
Bnd: '&';
Bor: '|';
Logop: And | Or | Xor | Bnd | Bor;
Neg: '!';
Boc: '~';
Negop: Neg | Boc;
Asl: '<<';
Asr: '>>';
Shftop: Asl | Asr;
Eql: '=';
Inc: '++';
Dec: '--';
Incop: Inc | Dec;
Peq: '+=';
Meq: '-=';
Teq: '*=';
Seq: '/=';
Req: '%=';
Casop: Peq | Meq | Teq | Seq | Req;
Lparen: '(';
Rparen: ')';
Lbrack: '[';
Rbrack: ']';
Lbrace: '{';
Rbrace: '}';
Point : '.';
Colon : ':';
Numvar: Number
| Identifier
| Mathop '(' Parameter+ ')';
Boolvar: Boolean
| Identifier
| Condop '(' Parameter+ ')'
| Logop '(' Parameter+ ')';
Metaxpr: (Identifier | Operator ) '(' Parameter+ ')';
/* First Parser Stage */
//expressions
add: '+' '(' Numvar+ ')';
sub: '-' '(' Numvar+ ')';
mlt: '*' '(' Numvar+ ')';
div: '/' '(' Numvar+ ')';
mod: '%' '(' Integer+ ')';
mathexpr: add
| sub
| mlt
| div
| mod;
eql: '==' '(' Parameter+ ')';
neq: '!=' '(' Parameter+ ')';
gtr: '>' '(' Parameter+ ')';
les: '<' '(' Parameter+ ')';
geq: '>=' '(' Parameter+ ')';
leq: '<=' '(' Parameter+ ')';
condexpr: eql
| neq
| gtr
| les
| geq
| leq;
and: '&&' '(' Parameter+ ')';
or : '||' '(' Parameter+ ')';
xor: '^' '(' Parameter+ ')';
bnd: '&' '(' Parameter+ ')';
bor: '|' '(' Parameter+ ')';
logexpr: and
| or
| xor
| bnd
| bor;
asl: '<<' '(' Parameter Numvar ')';
asr: '>>' '(' Parameter Numvar ')';
shiftexpr: asl | asr;
neg: '!' '(' Parameter ')';
boc: '~' '(' Parameter ')';
negexpr: neg
| boc;
arrexpr: Identifier '[' Numvar ']';
//instruction forms
vardec: 'def' '(' Identifier+ ')' ': ' Identifier ;
lindec: Identifier '(' Identifier ')';
assign: '=' '(' (Identifier | lindec) Parameter ')';
incstmt: (Inc | Dec) '(' Identifier ')'
| Casop '(' Identifier Identifier ')';
cond: 'if' '(' Boolvar ')' Block
('else if' '(' Boolvar ')' Block)?
('else' Block)?;
loop: (
('while' '(' (condexpr | negexpr) ')')
| ('for' '(' assign ',' (condexpr | negexpr) ',' incstmt')')
) Block;
fundef: 'func' '(' Identifier Parameter+ ')' ': ' Identifier Block;
prodef: 'proc' '(' Identifier Parameter* ')' Block;
call: Identifier '(' Parameter+ ')';
excHandler: 'try' Block
'catch' '(' Identifier ')' Block
('finally' Block)?;
classdef: 'class' '(' Identifier ')' (': ' _Identifier_)? _Block_;
ANTLR需要明确的语法规则。在提供的语法中,符号
规则与运算符
规则和其他规则冲突。标识符
和字母
规则冲突。当规则可以匹配相同的输入(内容和长度)时,它们会发生冲突。
此外,例如,symbol
规则将“{”
包含为ALT。在其任何ALT中使用文字“{”
(这是一种隐式令牌类型)的后续规则将不匹配,因为隐式令牌类型与symbol
令牌类型不相同。最佳做法是避免重复使用文字-在规则中定义文字,然后只引用该规则。
最好的建议是买一本TDAR来学习ANTLR4。
问题内容: 我创建的查询之一存在一个奇怪的“问题”。给定下一个查询: phpMyAdmin一直在引发有关没有名为“ LatestBookableTimestamp”的列的错误,即使我有一个由子查询检索的列,也就是该别名。我也尝试过使用tableprefix选择每一列。第八,这没有用。最终,我通过表别名选择了所有列,并为表指定了别名。一切都没有运气。 有人可以告诉我我在做什么错吗?我什至搜索了一些资
我面临的问题是在java中使用hibernate为postgres表执行以下查询。 该查询由使用内部连接从3个表中检索数据组成。 QryJourney=“选择journey.id、journey.operatingday、journey.linename、journey.scheduledeparturestopname、journeydetail.stopname、journeydetail.l
我有以下序列
我不确定这是否是一个与我没有这台计算机的管理权限有关的问题。任何帮助,以便我可以进一步排除故障,将非常感谢! 谢谢
如何正确拆分字符串,使Words[1]实际上是?谢谢你的帮助!
我创建了一个java代码来存储上传的文本文档。然后我返回该文件中的文本。所有文本均为“僧伽罗语”。UTF-8编码文本 输出直接发送到jsp页面,在那里显示为'??????????????'。 Windows 8.1、tomcat和java版本7。我已经用僧伽罗字符测试了jsp,它们正在工作。我添加了UTF-8作为内容类型。 我试过这个,这个,还有这个。