我正在构建用于学习的编程laguange的简单语法。
我遇到了奇怪的错误,对我来说毫无意义。
line 1:0 missing {'void', 'int', 'bool', 'string', 'union'} at 'void'
我正在使用此语法的预构建词法分析器和解析器:
grammar ProgrammingLanguage;
function_definition
: type_specifier IDENTIFIER '(' parameter_list_opt ')' compound_statement
;
type_specifier
: VOID
| INT
| BOOL
| STRING
| UNION
;
compound_statement
: '{' declaration_list statement_list '}'
;
statement_list
: statement
| statement statement_list
|
;
statement
: compound_statement
| selection_statement
| while_statement
| jump_statement
| expression_statement
| comment_statement
;
comment_statement
: COMMENT_START COMMENT
;
selection_statement
: IF '(' expression ')' compound_statement
| IF '(' expression ')' compound_statement ELSE compound_statement
| SWITCH '(' expression ')' compound_statement
;
expression_statement
: ';'
| expression ';'
;
jump_statement
: BREAK ';'
| CONTINUE ';'
;
while_statement
: WHILE '(' expression ')' compound_statement
;
primary_expression
: IDENTIFIER
| CONSTANT
| '(' expression ')'
| IDENTIFIER '(' primary_expression_list ')'
;
primary_expression_list
: primary_expression
| primary_expression primary_expression_list
|
;
expression
: logical_or_expression
| additive_expression
;
logical_or_expression
: logical_and_expression
| logical_or_expression '||' logical_and_expression
;
logical_and_expression
: compare_expression
| logical_and_expression '&&' compare_expression
;
compare_expression
: primary_expression compare_op primary_expression
| primary_expression
;
compare_op
: '<'
| '>'
| '=='
| '!='
| '<='
| '>='
;
additive_expression
: multiplicative_expression
| additive_expression '+' multiplicative_expression
| additive_expression '-' multiplicative_expression
;
multiplicative_expression
: primary_expression
| multiplicative_expression '*' primary_expression
| multiplicative_expression '/' primary_expression
| multiplicative_expression '%' primary_expression
;
assignment_expression
: IDENTIFIER '=' expression
;
id_list
: IDENTIFIER
| IDENTIFIER ',' id_list
;
declaration
: type_specifier id_list ';'
;
parameter_list_opt
: parameter_list
|
;
parameter_list
: type_specifier IDENTIFIER
| type_specifier IDENTIFIER ',' parameter_list
;
declaration_list
: declaration
| declaration declaration_list
|
;
/**------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------
*/
WHILE : 'while' ;
BREAK : 'break' ;
CONTINUE : 'continue' ;
SWITCH : 'switch' ;
IF : 'if' ;
ELSE : 'else' ;
COMMENT_START : '//' ;
IDENTIFIER : ('a'..'z'|'A'..'Z')('0'..'9'|'a'..'z'|'A'..'Z')*;
CONSTANT : FALSE|TRUE|STRING_VALUE|INT_VALUE;
STRING_VALUE : '"'COMMENT'"';
COMMENT : ('0'..'9'|'a'..'z'|'A'..'Z')*;
INT_VALUE : ('0'..'9')+;
FALSE : 'false';
TRUE : 'true';
VOID : 'void';
INT : 'int';
BOOL : 'bool';
STRING : 'string';
UNION : 'union';
WS : (' '|'\t'|'\n'|'\r')+ -> skip;
我正在解析此Java代码:
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
ProgrammingLanguageLexer lexer = new ProgrammingLanguageLexer(new ANTLRFileStream("input.txt"));
ProgrammingLanguageParser parser = new ProgrammingLanguageParser(new CommonTokenStream(lexer));
ParseTree tree = parser.function_definition();
ParseTreeWalker.DEFAULT.walk(new ProgrammingLanguageBaseListener(), tree);
}
}
最后是我要解析的字符串:
void power () {}
错误消息表示包含值“ void”的预期令牌类型与通过使用输入中的字符串“
void”产生的实际令牌类型不匹配。查看您的词法分析器规则,表明IDENTIFIER规则正在使用输入字符串’void’,从而生成IDENTIFIER类型的令牌,而不是VOID。
通常,与最长输入字符串匹配的词法分析器规则会获胜。对于两个(或更多)具有相同比赛时间的规则,第一个列出的获胜。将所有关键字规则移到IDENTIFIER规则上方。
有用的单元测试表单将转储lex标记,并显示匹配的实际标记类型。就像是:
CommonTokenStream tokens = ...
tokens.fill();
StringBuilder sb = new StringBuilder();
for (Token token : tokens.getTokens()) {
sb.append(((YourCustomTokenType) token).toString());
}
System.out.print(sb.toString());
Token.toString()方法通常足够好。覆盖您的令牌子类以适合您自己的需求。
我试图将sqldelight集成到Android/iOS的多平台库项目中,但在同步Gradle时出现了几个未解决的依赖错误。 错误:无法解析“:SharedCode@Debug/CompileClasspath”得依赖项:无法解析com.squareup.sqldelight:运行时:1.1.3. 错误:无法解析“:SharedCode@Release/CompileClasspath”得依赖项:
问题内容: 当我尝试从http://api-v3.deezer.com/1.0/search/album/?q=beethoven&index=2&nb_items=2&output=json使用以下方法获取JSON 时: 我得到: 但是使用http://search.twitter.com/search.json?q=beethoven&callback=?&count=5的JSON 可以正常工
我一直得到一个JSON解析器错误,每次我尝试连接从Android到php帐户。下面你会看到我得到的错误: 谁能帮帮我吗。。。 PHP代码: Android代码: Android代码: 公共JSONObject getJSONFromUrl(字符串url,列表参数){ 注册用户JSONObject PhP警告: php代码: 链接89是$no_of_rows 用户表结构: mysql_error:
本文向大家介绍JVM运行时数据区原理解析,包括了JVM运行时数据区原理解析的使用技巧和注意事项,需要的朋友参考一下 前言 Java虚拟机定义了若干种程序运行期间会使用的运行时数据区域,其中一些会随着虚拟机启动而创建,随着虚拟机的退出而销毁。另外一些则是和线程一一对应,这些与线程对应的数据区域随着线程开始而创建,线程的结束而销毁。 PC寄存器 PC寄存器是一块较小的内存空间,可以看作是当前线程所执行
问题内容: 我是mysql和jdbc的新手,但出现此标题错误。我整天都在搜索,找不到适合我的解决方案。 我尝试过的操作:卸载/重新安装mysql,将mysql-connector- java-5.1.25-bin.jar和ojdbc7.jar复制粘贴到与我要运行的.class文件相同的位置,然后将该程序重建在其他目录中,可能还有其他几件事。 我正在使用notepad ++进行编码,并使用Windo
我正在尝试仅使用本地依赖项编译和运行java grpc客户端,但出现以下错误: 这是我的gradle文件: 程序将编译,但不运行。我已经从protos生成了我的java文件,并验证了我是否使用了正确的protoc和protoc gen grpc java与我正在使用的jar库相对应。非常感谢您的帮助。