ما هو الخطأ في هذا المثال أنتلر 3 قواعد بايثون?

StackOverflow https://stackoverflow.com//questions/9611668

  •  09-12-2019
  •  | 
  •  

سؤال

أحاول أن تعلم كيفية استخدام أنتلر ، ويبدو أن تأتي عبر خطأ أثناء اتباع هذا "البرنامج التعليمي":https://theantlrguy.atlassian.net/wiki/display/ANTLR3/Five+minute+introduction+to+ANTLR+3

أساسا ، أنا إنشاء ملف سيمبلكالك.g:

grammar SimpleCalc;
 
options {
    language = Python;
}
 
tokens {
    PLUS    = '+' ;
    MINUS   = '-' ;
    MULT    = '*' ;
    DIV = '/' ;
}
 
@header {
import sys
import traceback
 
from SimpleCalcLexer import SimpleCalcLexer
}
 
@main {
def main(argv, otherArg=None):
  char_stream = ANTLRFileStream(sys.argv[1])
  lexer = SimpleCalcLexer(char_stream)
  tokens = CommonTokenStream(lexer)
  parser = SimpleCalcParser(tokens);
 
  try:
        parser.expr()
  except RecognitionException:
    traceback.print_stack()
}
 
/*------------------------------------------------------------------
 * PARSER RULES
 *------------------------------------------------------------------*/
 
expr    : term ( ( PLUS | MINUS )  term )* ;
 
term    : factor ( ( MULT | DIV ) factor )* ;
 
factor  : NUMBER ;
 
 
/*------------------------------------------------------------------
 * LEXER RULES
 *------------------------------------------------------------------*/
 
NUMBER  : (DIGIT)+ ;
 
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+    { $channel = HIDDEN; } ;
 
fragment DIGIT  : '0'..'9' ;

عندما أقوم بتشغيل أدوات أنتلر

 java -classpath antlr-3.1.3.jar antlr.Tool SimpleCalc.g

أتلقى أخطاء ، بدءا من السطر الأول:

ANTLR Parser Generator   Version 2.7.7 (20060906)   1989-2005
SimpleCalc.g:2:1: unexpected token: grammar
error: Token stream error reading grammar(s):
SimpleCalc.g:15:1: unexpected char: '@'
SimpleCalc.g:2:1: rule grammar trapped:
SimpleCalc.g:2:1: unexpected token: grammar
TokenStreamException: unexpected char: '@'

هذا يقودني إلى الاعتقاد بأنني أفعل شيئا غبيا ، لكنني لست متأكدا من ماذا.

هل كانت مفيدة؟

المحلول

أنت تستخدم الخطأ Tool فئة لتوليد ليكسر ومحلل.معظم أنتلر 3.لا تزال الإصدارات س لها تبعيات مع الإصدار الأقدم 2.7 ، والذي تم تضمينه في الإصدار 3.x.ال Tool فئة من الإصدار 2.7 يسمى antlr.Tool, بينما الإصدار 3.يسمى الإصدار العاشر org.antlr.Tool.هذا الأخير هو واحد يجب أن تستخدم:

java -classpath antlr-3.1.3.jar org.antlr.Tool SimpleCalc.g

تحرير

وهنا التجريبي قليلا على أساس قواعد اللغة من ويكي ، ولكن بعد ذلك مع قليلا من رمز بيثون تضاف إليها أن يقيم التعبير:

grammar SimpleCalc;

options {
  language=Python;
}

@header {
import sys
import traceback

from SimpleCalcLexer import SimpleCalcLexer
}

@main {
def main(argv, otherArg=None):
  char_stream = ANTLRStringStream(sys.argv[1])
  lexer = SimpleCalcLexer(char_stream)
  tokens = CommonTokenStream(lexer)
  parser = SimpleCalcParser(tokens);

  try:
    print parser.eval()
  except RecognitionException:
    traceback.print_stack()
}

eval returns [value]
 : add EOF {$value = $add.value}
 ;

add returns [value]
 : m1=mult {$value = $m1.value} ( '+' m2=mult {$value += $m2.value}
                                | '-' m2=mult {$value -= $m2.value}
                                )* 
 ;

mult returns [value]
 : a1=atom {$value = $a1.value} ( '*' a2=atom {$value *= $a2.value}
                                | '/' a2=atom {$value /= $a2.value}
                                )* 
 ;

atom returns [value]
 : NUMBER      {$value = float($NUMBER.text)}
 | '(' add ')' {$value = $add.value}
 ;

NUMBER         : DIGIT+ ('.' DIGIT*)?;
WHITESPACE     : ('\t' | ' ' | '\r' | '\n')+ {$channel = HIDDEN;};
fragment DIGIT : '0'..'9' ;

توليد ليكسر / محلل وتقييم التعبير:

java -cp antlr-3.1.3.jar org.antlr.Tool SimpleCalc.g
python SimpleCalcParser.py "5 * (8 + 2)"

ينتج الإخراج:

50.0
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top