gpt4 book ai didi

parsing - ANTLR 歧义 '-'

转载 作者:行者123 更新时间:2023-12-02 10:12:10 26 4
gpt4 key购买 nike

我有语法,一切正常,直到这部分:

lexp
: factor ( ('+' | '-') factor)*
;

factor :('-')? IDENT;

这当然会带来歧义。例如,a-a 可以通过 Factor - FactorFactor -> - IDENT

进行匹配

我收到以下警告:

[18:49:39] warning(200): withoutWarningButIncomplete.g:57:31: 
Decision can match input such as "'-' {IDENT, '-'}" using multiple alternatives: 1, 2

如何解决这种歧义?我只是看不到解决办法。我可以使用某种选项吗?

这是完整的语法:

program 
: includes decls (procedure)*
;

/* Check if correct! */
includes
: ('#include' STRING)*
;

decls
: (typedident ';')*
;

typedident
: ('int' | 'char') IDENT
;

procedure
: ('int' | 'char') IDENT '(' args ')' body
;

args
: typedident (',' typedident )* /* Check if correct! */
| /* epsilon */
;

body
: '{' decls stmtlist '}'
;

stmtlist
: (stmt)*;

stmt

: '{' stmtlist '}'
| 'read' '(' IDENT ')' ';'
| 'output' '(' IDENT ')' ';'
| 'print' '(' STRING ')' ';'
| 'return' (lexp)* ';'
| 'readc' '(' IDENT ')' ';'
| 'outputc' '(' IDENT ')' ';'
| IDENT '(' (IDENT ( ',' IDENT )*)? ')' ';'
| IDENT '=' lexp ';';



lexp
: term (( '+' | '-' ) term) * /*Add in | '-' to reveal the warning! !*/
;

term
: factor (('*' | '/' | '%') factor )*
;


factor : '(' lexp ')'
| ('-')? IDENT
| NUMBER;




fragment DIGIT
: ('0' .. '9')
;

IDENT : ('A' .. 'Z' | 'a' .. 'z') (( 'A' .. 'Z' | 'a' .. 'z' | '0' .. '9' | '_'))* ;


NUMBER
: ( ('-')? DIGIT+)
;

CHARACTER
: '\'' ('a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '\\n' | '\\t' | '\\\\' | '\\' | 'EOF' |'.' | ',' |':' ) '\'' /* IS THIS COMPLETE? */
;

最佳答案

正如评论中提到的:这些规则含糊不清:

lexp
: factor (('+' | '-') factor)*
;

factor : ('-')? IDENT;

这就是歧义的原因:

'return' (lexp)* ';'

它可以用两种不同的方式解析输入a-b:

  1. a-b 作为单个二进制表达式
  2. a 作为单个表达式,-b 作为一元表达式

您需要更改语法。也许在多个返回值中添加一个逗号?像这样的事情:

'return' (lexp (',' lexp)*)? ';'

将匹配:

return;
return a;
return a, -b;
return a-b, c+d+e, f;
...

关于parsing - ANTLR 歧义 '-',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14839654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com