[antlr-interest] Error output from org.antlr.Tool with language=Python, but generates code OK

Arthur Perry arthur.r.perry at gmail.com
Sun Sep 26 14:37:49 PDT 2010


Sorry - I actually am using a real grammar with parser and lexer
rules.  I'll paste the grammar at the end of this message, it is
pretty long.  I just thought I'd see if Bernt figured out the issue,
because I am getting the exact same error with the same version of
Antlrworks - 1.2.2

I do not get the error at all when I generate the Python code with
Antlrworks 1.4.  However, the the latest Python runtime seems to be
3.1.2, and Antlrworks 1.4 generates code for the 3.2 runtime.

If there is a Python runtime for 3.2, that would probably solve my
problem.  Can someone point me to it?

Thanks!

-Art


> From: "Kevin J. Cummings" <cummings at kjchome.homeip.net>
> In Bernt's example below, prog is an empty rule.  Not a good idea.
> Probably deserving of a better error message though.
>
> If this is specific to the python project, you'd have to get an answer
> from one of the Python maintainers.

> From: "Jim Idle" <jimi at temporal-wave.com>
> You have no lexer rules. It is just a syntax error in your .g file. These
> will be better reported in ANTLR 4
>
> Jim
>

grammar PricingP;
options { language=Python;}

@members  { pricingHelper = "" }

pricingScript
	:	(condCase | clauseCase)+  'endCase:'? EOF
	;

condCase
	: 	{self.pricingHelper.incrementIndent()}
		'condCase:' condExpr 'then:' ((condCase | clauseCase)+ 'endCase:' |
pcTypeExpr )
		{self.pricingHelper.decrementIndent()}
		;

condExpr
	:	{ 	
			self.pricingHelper.resetIntermediateBuffer()
		}
		((dateRange | finRatio | extRating | balCond | hlt | outsideCondition )
			(andOr=STRING
			{	self.pricingHelper.addLineToResult(self.pricingHelper.intermediateBuffer.toString()
+ " " + self.pricingHelper.trimColon($andOr.text))
				self.pricingHelper.resetIntermediateBuffer()
			}		
			)?
		)+
		{self.pricingHelper.addLineToResult(self.pricingHelper.intermediateBuffer.toString());
		}
		;

outsideCondition
	:	'OUT:' outsideConditionCode=RIDSTRING outsideConditionValue=STRING
		{				
			self.pricingHelper.getIntermediateBuffer().append( "If( " +
self.pricingHelper.getNot($outsideConditionValue.text) + " " +
self.pricingHelper.lookupOutsideCondition(self.pricingHelper.trimCurlies($outsideConditionCode.text))
+ " )")
		}
	;

balCond
	:	'balCond:' pricingOptionOrAmount=RIDSTRING balanceType=RIDSTRING
facOrDeal=RIDSTRING minBalOp=STRING (('mn:' minBalValue=RIDSTRING) |
minBalValue=STRING) maxBalOp=STRING (('mn:' maxBalValue=RIDSTRING ) |
maxBalValue=STRING)
		{
			balType = ""
			if self.pricingHelper.trimCurlies($pricingOptionOrAmount.text).equalsIgnoreCase("AVG")
:
				balType = self.pricingHelper.lookupBalanceType(self.pricingHelper.trimCurlies($balanceType.text))
			else :
				balType = self.pricingHelper.lookupPricingOption(self.pricingHelper.trimCurlies($balanceType.text))
			
			self.pricingHelper.getIntermediateBuffer().append("( " +
self.pricingHelper.lookupFacOrDeal(self.pricingHelper.trimCurlies($facOrDeal.text))
+ " " + balType
			+ " ) From: ( " + $minBalOp.text + " ): " +
self.pricingHelper.formatCurrency($minBalValue.text) + " To ( " +
$maxBalOp.text + " ): " +
self.pricingHelper.formatCurrency($maxBalValue.text))
		}
	;
	
hlt :	 'HLT:' hltValue=STRING
		{	self.pricingHelper.getIntermediateBuffer().append( "If( " +
self.pricingHelper.getNot($hltValue.text) + " HLT )")}
		;

dateRange
	:	'dateRange:' minDateOp=STRING 'mn:'? minDateValue=RIDSTRING
maxDateOp=STRING 'mn:'? maxDateValue=RIDSTRING
	{self.pricingHelper.getIntermediateBuffer().append("From ( " +
$minDateOp.text + " ): " +
self.pricingHelper.formatDate(self.pricingHelper.trimCurlies($minDateValue.text))
+ " To ( " +  $maxDateOp.text + " ): " +
self.pricingHelper.formatDate(self.pricingHelper.trimCurlies($maxDateValue.text)))};
	
finRatio
	:	'finRatio:' finRatioType=RIDSTRING minFinRatioOp=STRING  (('mn:'
minFinRatioValue=RIDSTRING) | minFinRatioValue=STRING)
maxFinRatioOp=STRING (('mn:' maxFinRatioValue=RIDSTRING) |
maxFinRatioValue=STRING)
	{self.pricingHelper.getIntermediateBuffer().append("( Financial Ratio
- " + self.pricingHelper.lookupFinancialRatio(self.pricingHelper.trimCurlies($finRatioType.text))
+ " ) From ( " + $minFinRatioOp.text + " ): " + $minFinRatioValue.text
+ " To ( " + $maxFinRatioOp.text + " ): " + $maxFinRatioValue.text)};
	

extRating
	:	'extRating:' extRatingType=RIDSTRING extRatingRID=RIDSTRING
minRatingOp=STRING minRatingValue=RIDSTRING  maxRatingOp=STRING
maxRatingValue=RIDSTRING
		{	
		    self.pricingHelper.getIntermediateBuffer().append("( " +
self.pricingHelper.trimCurlies(self.pricingHelper.lookupCustomer($extRatingRID.text))
+ " - " + self.pricingHelper.trimCurlies(self.pricingHelper.lookupExternalRatingCode($extRatingType.text))
+ " ) From ( " + $minRatingOp.text + " ): " +
self.pricingHelper.trimCurlies($minRatingValue.text) + " To ( " +
$maxRatingOp.text + " ): " +
self.pricingHelper.trimCurlies($maxRatingValue.text))
		};
	
clauseCase
	:	{self.pricingHelper.incrementIndent()}
		'clauseCase:'  (fee | option)
		'then:' ((condCase | clauseCase)+  'endCase:'| pcTypeExpr)
		{self.pricingHelper.decrementIndent()}
		;

fee :	
		'feeType:' feeTypeCode=RIDSTRING  feeCategory=RIDSTRING bankCode=RIDSTRING
		{	self.pricingHelper.addLineToResult(self.pricingHelper.lookupPricingFeeCategory(self.pricingHelper.trimCurlies($feeCategory.text))
+ " - " + self.pricingHelper.lookupFeeTypeCode(self.pricingHelper.trimCurlies($feeTypeCode.text)))}
		;

option
	:	
		'optName:' optname=RIDSTRING  optOption=RIDSTRING
		{	self.pricingHelper.addLineToResult(self.pricingHelper.lookupPricingOptionName(self.pricingHelper.trimCurlies($optname.text))+":")}
	;

pcTypeExpr
	:	{	self.pricingHelper.incrementIndent()
			self.pricingHelper.resetIntermediateBuffer()
		}
		'pcType:' pcType=RIDSTRING ('minAmt:' minAmtValue=STRING)?',' rateExpr
		{	self.pricingHelper.addLineToResult(self.pricingHelper.getIntermediateBuffer().toString())
			self.pricingHelper.decrementIndent()
		};
		
rateExpr
	:	(rate | bal) (op (spread|cdsrate))? ;
	
bal :	'bal:' balType=RIDSTRING
		{
 			self.pricingHelper.getIntermediateBuffer().append(self.pricingHelper.lookupFeeBalanceType(self.pricingHelper.trimCurlies($balType.text)))
		}
	;

rate
	:	((compareExpr | baseRate)) ;
	
compareExpr 	:	rateCompare=('HO' | 'LO' | 'AO' | 'BP' ) '('
				{	self.pricingHelper.getIntermediateBuffer().append(self.pricingHelper.lookupRateCompare($rateCompare.text)
+ " ( ")
				}
				((baseRate|floorCeiling)
','{self.pricingHelper.getIntermediateBuffer().append(", ")}
				)+
				
				(baseRate|floorCeiling) ')'
				{ 	self.pricingHelper.getIntermediateBuffer().append(" ) ")
				}
				(baseSpread)?;

baseRate
 	:	'baseRate:' rateName=RIDSTRING
 		{
 			self.pricingHelper.getIntermediateBuffer().append(" ( " +
self.pricingHelper.lookupBaseRate(self.pricingHelper.trimCurlies($rateName.text)))
 		}
 		(baseSpread)?
 		{ self.pricingHelper.getIntermediateBuffer().append(" )") }
 		;	

baseSpread	:
		{	values = []      }
		(op1=STRING spreadValueType1=STRING spreadValue1=STRING
		{ 	val = [$op1.text, $spreadValue1.text, $spreadValueType1.text ]
		  	values.append(val)
		  }
		)+
		{	
			if len(values)<2:
				val = values[0]
				self.pricingHelper.getIntermediateBuffer().append(" " + val[0] + "
" + self.pricingHelper.calculateSpreadValue(val[1], val[2]) +
self.pricingHelper.lookupSpreadValueType(val[2]))
			else :
				self.pricingHelper.getIntermediateBuffer().append(" " + values[0][0] + " (")
				i = 0
				for val in values:
					if i > 0:
						self.pricingHelper.getIntermediateBuffer().append(" " + val[0] + " ")
					
					self.pricingHelper.getIntermediateBuffer().append(self.pricingHelper.calculateSpreadValue(val[1],
val[2]) + self.pricingHelper.lookupSpreadValueType(val[2]))
					i = i+1
				
				self.pricingHelper.getIntermediateBuffer().append(")")
			
		};	
			
floorCeiling
	:	spreadValueType2=STRING spreadValue2=STRING
			{	self.pricingHelper.getIntermediateBuffer().append(" " +
self.pricingHelper.calculateSpreadValue($spreadValue2.text,
$spreadValueType2.text) +
self.pricingHelper.lookupSpreadValueType($spreadValueType2.text))
			}
	;			

op 	:	'op:' opValue=STRING
			{	
				if $opValue.text == "*" :
					self.pricingHelper.getIntermediateBuffer().append(" X Rate " )
				elif $opValue.text == "+" :
					self.pricingHelper.getIntermediateBuffer().append(" " +
($opValue.text) + " Spread " )
				
			};	


spread 	:	'spread:' spreadValueType=RIDSTRING spreadValue=STRING
			{	self.pricingHelper.getIntermediateBuffer().append( "(" +
self.pricingHelper.calculateSpreadValue($spreadValue.text,
$spreadValueType.text) +
self.pricingHelper.lookupSpreadValueType($spreadValueType.text) + ")
")
			};	
cdsrate	:	'cdsRate:(' ((STRING|RIDSTRING)(',')?)+ ')'
			{
				self.pricingHelper.getIntermediateBuffer().append( "(FLOATING)" )
			};	
RIDSTRING : '{'('a'..'z' | 'A'..'Z' |  '0'..'9' | '.'| '<'| '('| '+'|
'!'| '*'| ')'| ';'| '>'| '?'| ':'| '#'| '@'| '=' | '/' | '-' | ','
|'$')+'}';
STRING 	: ('a'..'z' | 'A'..'Z' |  '0'..'9' | '.' | '=' | '<' | '>' |
':' | '/' | '+' | '-' | '{' | '}' | '*'| '!' | ';'| '?' | '@')+ ; // |
'(' | ')' | ','
WS 	: (' ' |'\t' | '\r' | '\n')+ {self.skip()} ;


More information about the antlr-interest mailing list