ANTLR қатесі: Шешім бірнеше балама арқылы кіріске сәйкес келуі мүмкін

ANTLR грамматикасының қатесін қалай өңдеуді көрмеймін:

****************error message*********
Decision can match input such as "{'+', '-'} IDENT" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
 |---> add: mult (('+'|'-') mult)*;
***************************************

Бұл көбінесе Скотт мысалынан көшіріледі, бірақ мен оның неге жақсы жұмыс істейтінін көрмеймін, бірақ менің күйім қалдырып, одан қалай шығу керек?

--------------- келесі Sample.g ----------------

grammar Sample;

options { 
  language = Java;
}


 program
      :  'program' IDENT '='
          (constant| variable)*
          'begin'
          (statement)*
          'end' IDENT '.'
      ; 

constant:
       'constant' IDENT ':' type ':=' expression ';' 
      ;

type: 'integer';

variable: 'var' IDENT (',' IDENT)* ':' type  ';';


statement: 'var' IDENT ':=' INTEGER ';' ;

//expression

term: IDENT |'(' expression ')'|INTEGER;
negation: 'not'* term;
unary: ('+'|'-')* negation;
mult: unary (('*'|'/'|'mod') unary)*;

[XXX Келесі жолға арналған қате]

add: mult (('+'|'-') mult)*;
relation: add (('='|'/='|'<'|'<=') add)*;
expression: (relation ('and'|'or') relation)*;


END : 'end';

CONSTANT : 'constant';

INTEGER: '0'| (('1'..'9') ('0'..'9')*);   

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

WS: ('\n'|' '|'\t'|'r'|'\f')+ {$channel=HIDDEN;};
1

2 жауаптар

  1. Кодты таңдаған жерден бастапқы веб-бетті еске салған жөн. Менің ойымша, бұл Antlr3xtut .

Бұл көбінесе Скотт мысалынан көшіріледі, бірақ неге түсінбеймін   оның шығармалары жақсы, бірақ менің кептеліп қалғаным қалай болды?

Бұл сіз дұрыс емес түрде көшірілгендігіңіз.

Төменде көрсетілген дұрыс кодтың орнына:

expression
    :   relation (('and' | 'or') relation)*
    ;

Сіз көшірдіңіз:

expression: (relation ('and'|'or') relation)*;

Қатені байқай аласыз ба? Мысалы, '(' қатені алсаңыз, шешім «{' +, '-' } IDENT «бірнеше балама арқылы :

enter image description here

Шешім

Шрифт үлгісінде берілген өрнек ережесін ауыстырыңыз.

2
қосылды
Фавониусқа рахмет, мен дұрыс емес көшірме жасадым. Айтуға болатын осы әдемі ағашты қайдан білдіңіз? Бір грамматиканы жөндеу үшін қатты ауыр секілді ...
қосылды автор zell, көзі
Шатастырылған! Менде мұнда дұрыс емес ақыл-ой бар. Кіруді «+ x» деп айтыңыз. Өрнекпен бастаңыз. Бізге түсініксіз -> қатынас -> add -> unary түсініксіз болды. Содан кейін Unary не 1) «+» дегенді оның («+» | «-») * бөлігі деп таниды немесе 2) «+ x» деп жалғастыру үшін терминді қолдануға тырысады. Егер 1) таңдалса, ол «x» сөзін түпнұсқалық, термин және IDENT ретінде қайталауға тырысады. Егер 2) таңдалса, онда ол ақырындап тұрып қалады және осылайша, қандай да бір белгісіздік туралы хабарлауға болмайды, жоқ па? Мүмкін, мен ANTLR жұмыс істеген дұрыс емес екенін атап өтті. Пожалуйста, назар аударыңыз. Сіздің идеяларыңыз үшін үлкен рахмет.
қосылды автор zell, көзі
@zell, сіз ANTLRWorks ( CTRL ALT + G ), ANTLRWorks таныс қатеге шағымданады «Шешім» {«+», «-» Егер сіз қызыл түске боялған ережені бассаңыз, жоғарыдағы сурет Синтаксис-Диаграмма қойындысында көрінеді, бірақ адал болу үшін, бұл суреттер жиі мені көп шатастырады, қате туралы хабар көп болады маған жеке көмек көрсету, бірақ ANTLR грамматикасындағы қатені түзету жиі қиын, тіпті сіз оны білесіз.
қосылды автор Bart Kiers, көзі
@zell, менің жауапты қараңыз.
қосылды автор Bart Kiers, көзі

Сіз жақшасызды:

expression: (relation ('and'|'or') relation)*;

грамматиканы бірдей емес етіп жасау: талдаушы - IDENT - қосу - немесе unary -rule .

Мысалы, ереже expression енді сәйкес келеді:

relation ('and'|'or') relation relation ('and'|'or') relation

яғни бір-бірінен кейін тікелей орналастырылатын екі қатынасы ережелері. Егер талдаушы төмендегідей кірісте болса:

- A - B

талдаушы осы кірісті талдау үшін «көреді»:

1 (unary expression & unary expression)

enter image description here

2 (unary & add expression)

enter image description here

Бұл:

expression: relation (('and'|'or') relation)*;

оның орнына ешқашан екі дәйектілік өрнегі болмайды (және ешқандай белгісіздік!).

2
қосылды
Рақмет сізге. Бірақ мен мұнда неге екені белгісіз екендігін түсінбеймін. (Фавонийдің жауабы үшін менің ескертулерім) Мысал үшін, «+ x» қалай түсіндіруге болатындығын түсіндіре аласыз ба? Көп рақмет.
қосылды автор zell, көзі
Көп рақмет. Бұл шынында да өте пайдалы!
қосылды автор zell, көзі
Айтпақшы, сіздің түсініктемеіңіздің арқасында қазір түсінікті бола аламын, бірақ мен оның қате туралы хабарын басшылыққа ала отырып, мәселенің қайнар көзін анықтау өте қиын екенін білемін. Бұл білетін парассер генераторларының біреуі болуы мүмкін! Бартқа тағы да рахмет.
қосылды автор zell, көзі
@zell, бұл нақты емес + X (немесе -X ) енгізу емес, бірақ бөлігі кіріс туралы. Мен жоғарыда келтірілген жауапта біразырақ түсіндіруге тырыстым.
қосылды автор Bart Kiers, көзі
@zell, келісілген, параллельді how деп табу қиын, ол бірнеше әдіспен енгізіледі. Егер сіз тілдерді талдау (және/немесе ANTLR) туралы көбірек білсеңіз, болады жеңілірек болады, бірақ сізді кейде жұмбақ болады. Оқасы жоқ!
қосылды автор Bart Kiers, көзі