当前位置: 首页 > 知识库问答 >
问题:

ANTLR4语法冲突规则

杨星纬
2023-03-14

我的语法允许以下操作:

grammar TEST;

file :  (varDecl | functionDcl)+    ;
varDecl :   type ID ('=' expression)?   ';'     ;
type :  'int' | 'float' | 'void'    ;
functionDcl :   type ID '(' formalParameters? ')' block ;
formalParameters :  formalParameter (',' formalParameter)*  ;   
formalParameter :   type ID     ;
block : '{' stat* '}'   ;
stat :  block
     |  varDecl
     |  'if' expression 'then' stat ('else' stat)?
     |  'return' expression? ';'
     |  expression '=' expression ';'
     |  expression ';'
     ;
expression : unaryExprNotPlusMinus (intervalOp unaryExprNotPlusMinus)? ;
unaryExprNotPlusMinus :  unaryOp expression  
                      |  INT 
                      |  FloatingPointLiteral
                      ;


unaryOp : '~' | '!' | 'not' | 'typeof' | 'statictypeof';
intervalOp : '..' | '|..' | '..|' | '|..|'  ;

INT : JavaIDDigit+ ;
ID : Letter (Letter|JavaIDDigit)* ;

fragment
Letter
    :  '\u0024' |
       '\u0041'..'\u005a' |
       '\u005f' |
       '\u0061'..'\u007a' |
       '\u00c0'..'\u00d6' |
       '\u00d8'..'\u00f6' |
       '\u00f8'..'\u00ff' |
       '\u0100'..'\u1fff' |
       '\u3040'..'\u318f' |
       '\u3300'..'\u337f' |
       '\u3400'..'\u3d2d' |
       '\u4e00'..'\u9fff' |
       '\uf900'..'\ufaff'
    ;

fragment
JavaIDDigit
    :  '\u0030'..'\u0039' |
       '\u0660'..'\u0669' |
       '\u06f0'..'\u06f9' |
       '\u0966'..'\u096f' |
       '\u09e6'..'\u09ef' |
       '\u0a66'..'\u0a6f' |
       '\u0ae6'..'\u0aef' |
       '\u0b66'..'\u0b6f' |
       '\u0be7'..'\u0bef' |
       '\u0c66'..'\u0c6f' |
       '\u0ce6'..'\u0cef' |
       '\u0d66'..'\u0d6f' |
       '\u0e50'..'\u0e59' |
       '\u0ed0'..'\u0ed9' |
       '\u1040'..'\u1049'
   ;

FloatingPointLiteral
    :   ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix?
    |   '.' ('0'..'9')+ Exponent? FloatTypeSuffix?
    |   ('0'..'9')+ Exponent FloatTypeSuffix?
    |   ('0'..'9')+ FloatTypeSuffix
    |   ('0x' | '0X') (HexDigit )*
        ('.' (HexDigit)*)?
        ( 'p' | 'P' )
        ( '+' | '-' )?
        ( '0' .. '9' )+
        FloatTypeSuffix?
    ;

fragment
Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;

fragment
FloatTypeSuffix : ('f'|'F'|'d'|'D'|'bd'|'BD') ;

fragment
HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;

COMMENT
    :   '/*' .*? '*/'    -> channel(HIDDEN) 
    ;
WS  :   [ \r\t\u000C\n]+ -> channel(HIDDEN)
    ;

LINE_COMMENT
    : '//' ~[\r\n]* '\r'? '\n' -> channel(HIDDEN)
    ;

我从其他语法中抓了几个东西来玩。我的主要问题是我的expr规则。给定以下输入:int aaaa=0..9;,我期望解析树会找到..规则,但它将解释0。并不正确解析其余部分。

如果在我的0后面加上一个空格,就可以了:int aaaa=0..9;

谢了!

共有1个答案

慕凌
2023-03-14

lexer在解析器执行之前标记字符输入。解析器只对令牌进行操作。将unaryopintervalop规则转换为lexer规则,以便它们可以参与标记化过程。

更新

@电晕做了一个有效的观察。仅有所建议的改变是不够的。将unaryopintervalop规则移动到lexer,并将FloatingPointLiteral规则更改为

FloatingPointLiteral
    :   ('0'..'9')+ '.' ('0'..'9')+ Exponent? FloatTypeSuffix?
    ...
 类似资料:
  • 在“功能”部分中,它说 该= 注意:在箭头(= 但是在“匿名函数”部分中,它说 如果函数只包含一个语句,则可以使用箭头表示法缩短它 这是否意味着我可以在匿名函数中使用不是表达式的语句(例如if语句)? 还是我混淆了表达和陈述的概念?我想 表达式:可以求值为一个值(2 3,print(")也属于表达式) 语句:可以执行的代码。所有表达式都可以是语句。如果语句和返回语句是不是表达式的语句的示例。 如果

  • 问题内容: 错误 : ALTER TABLE语句与CHECK约束“ PaymentCheck”冲突。数据库“ MERP”的表“ Kuri.Payment”中发生了冲突。 表结构是这样的 问题答案: 该错误清楚地表明:表中的某些行 违反 了检查约束。 由于您的检查约束条件测试为,因此您可以使用来找到违反此检查约束条件的行 修复或删除这些行,然后就可以了,您的命令应该可以正常工作

  • 问题内容: 我正在尝试执行一些SQL,但是出现以下错误 但是似乎无法弄清楚问题出在哪里???任何帮助将不胜感激。 我的SQL技能是相当基本的,因此希望有人可以提供帮助 ~ ~ ~工作代码 ~ ~ ~ 设法使其正常工作,这是代码 问题答案: 归类基本上是告诉sql如何解释/比较/排序字符串的代码页。例如,可以区分大小写(不区分大小写)或忽略(不忽略)重音(如法语中的^)。有关更多信息,请参见此处。

  • 问题内容: 我有一个带有客户ID的table_Project(链接到tbl_Customer)。在tbl_Customer中,我有Customer_ID(作为密钥)和其他一些信息,例如电话,电子邮件等。 要将其从Gridview中删除,请使用以下DeleteCommand: 但这给了我以下错误: 但是通过更新CustomerInfo我没有得到任何错误。我已经看到了C#的不同解决方案,但是我使用.n

  • 我在ANTLR4中有以下语法 一切都很好.我在语法1中哪里错了?