Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 872307
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 15, 20262026-05-15T10:46:00+00:00 2026-05-15T10:46:00+00:00

What is a semantic predicate in ANTLR?

  • 0

What is a semantic predicate in ANTLR?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-15T10:46:00+00:00Added an answer on May 15, 2026 at 10:46 am

    ANTLR 4

    For predicates in ANTLR 4, checkout these stackoverflow Q&A’s:

    • Syntax of semantic predicates in Antlr4
    • Semantic predicates in ANTLR4?

    ANTLR 3

    A semantic predicate is a way to enforce extra (semantic) rules upon grammar
    actions using plain code.

    There are 3 types of semantic predicates:

    • validating semantic predicates;
    • gated semantic predicates;
    • disambiguating semantic predicates.

    Example grammar

    Let’s say you have a block of text consisting of only numbers separated by
    comma’s, ignoring any white spaces. You would like to parse this input making
    sure that the numbers are at most 3 digits “long” (at most 999). The following
    grammar (Numbers.g) would do such a thing:

    grammar Numbers;
    
    // entry point of this parser: it parses an input string consisting of at least 
    // one number, optionally followed by zero or more comma's and numbers
    parse
      :  number (',' number)* EOF
      ;
    
    // matches a number that is between 1 and 3 digits long
    number
      :  Digit Digit Digit
      |  Digit Digit
      |  Digit
      ;
    
    // matches a single digit
    Digit
      :  '0'..'9'
      ;
    
    // ignore spaces
    WhiteSpace
      :  (' ' | '\t' | '\r' | '\n') {skip();}
      ;
    

    Testing

    The grammar can be tested with the following class:

    import org.antlr.runtime.*;
    
    public class Main {
        public static void main(String[] args) throws Exception {
            ANTLRStringStream in = new ANTLRStringStream("123, 456, 7   , 89");
            NumbersLexer lexer = new NumbersLexer(in);
            CommonTokenStream tokens = new CommonTokenStream(lexer);
            NumbersParser parser = new NumbersParser(tokens);
            parser.parse();
        }
    }
    

    Test it by generating the lexer and parser, compiling all .java files and
    running the Main class:

    java -cp antlr-3.2.jar org.antlr.Tool Numbers.g
    javac -cp antlr-3.2.jar *.java
    java -cp .:antlr-3.2.jar Main
    

    When doing so, nothing is printed to the console, which indicates that nothing
    went wrong. Try changing:

    ANTLRStringStream in = new ANTLRStringStream("123, 456, 7   , 89");
    

    into:

    ANTLRStringStream in = new ANTLRStringStream("123, 456, 7777   , 89");
    

    and do the test again: you will see an error appearing on the console right after the string 777.


    Semantic Predicates

    This brings us to the semantic predicates. Let’s say you want to parse
    numbers between 1 and 10 digits long. A rule like:

    number
      :  Digit Digit Digit Digit Digit Digit Digit Digit Digit Digit
      |  Digit Digit Digit Digit Digit Digit Digit Digit Digit
         /* ... */
      |  Digit Digit Digit
      |  Digit Digit
      |  Digit
      ;
    

    would become cumbersome. Semantic predicates can help simplify this type of rule.


    1. Validating Semantic Predicates

    A validating semantic predicate is nothing
    more than a block of code followed by a question mark:

    RULE { /* a boolean expression in here */ }?
    

    To solve the problem above using a validating
    semantic predicate, change the number rule in the grammar into:

    number
    @init { int N = 0; }
      :  (Digit { N++; } )+ { N <= 10 }?
      ;
    

    The parts { int N = 0; } and { N++; } are plain Java statements of which
    the first is initialized when the parser “enters” the number rule. The actual
    predicate is: { N <= 10 }?, which causes the parser to throw a
    FailedPredicateException
    whenever a number is more than 10 digits long.

    Test it by using the following ANTLRStringStream:

    // all equal or less than 10 digits
    ANTLRStringStream in = new ANTLRStringStream("1,23,1234567890"); 
    

    which produces no exception, while the following does thow an exception:

    // '12345678901' is more than 10 digits
    ANTLRStringStream in = new ANTLRStringStream("1,23,12345678901");
    

    2. Gated Semantic Predicates

    A gated semantic predicate is similar to a validating semantic predicate,
    only the gated version produces a syntax error instead of a FailedPredicateException.

    The syntax of a gated semantic predicate is:

    { /* a boolean expression in here */ }?=> RULE
    

    To instead solve the above problem using gated predicates to match numbers up to 10 digits long you would write:

    number
    @init { int N = 1; }
      :  ( { N <= 10 }?=> Digit { N++; } )+
      ;
    

    Test it again with both:

    // all equal or less than 10 digits
    ANTLRStringStream in = new ANTLRStringStream("1,23,1234567890"); 
    

    and:

    // '12345678901' is more than 10 digits
    ANTLRStringStream in = new ANTLRStringStream("1,23,12345678901");
    

    and you will see the last on will throw an error.


    3. Disambiguating Semantic Predicates

    The final type of predicate is a disambiguating semantic predicate, which looks a bit like a validating predicate ({boolean-expression}?), but acts more like a gated semantic predicate (no exception is thrown when the boolean expression evaluates to false). You can use it at the start of a rule to check some property of a rule and let the parser match said rule or not.

    Let’s say the example grammar creates Number tokens (a lexer rule instead of a parser rule) that will match numbers in the range of 0..999. Now in the parser, you’d like to make a distinction between low- and hight numbers (low: 0..500, high: 501..999). This could be done using a disambiguating semantic predicate where you inspect the token next in the stream (input.LT(1)) to check if it’s either low or high.

    A demo:

    grammar Numbers;
    
    parse
      :  atom (',' atom)* EOF
      ;
    
    atom
      :  low  {System.out.println("low  = " + $low.text);}
      |  high {System.out.println("high = " + $high.text);}
      ;
    
    low
      :  {Integer.valueOf(input.LT(1).getText()) <= 500}? Number
      ;
    
    high
      :  Number
      ;
    
    Number
      :  Digit Digit Digit
      |  Digit Digit
      |  Digit
      ;
    
    fragment Digit
      :  '0'..'9'
      ;
    
    WhiteSpace
      :  (' ' | '\t' | '\r' | '\n') {skip();}
      ;
    

    If you now parse the string "123, 999, 456, 700, 89, 0", you’d see the following output:

    low  = 123
    high = 999
    low  = 456
    high = 700
    low  = 89
    low  = 0
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Ask A Question

Stats

  • Questions 440k
  • Answers 440k
  • Best Answers 0
  • User 1
  • Popular
  • Answers
  • Editorial Team

    How to approach applying for a job at a company ...

    • 7 Answers
  • Editorial Team

    How to handle personal stress caused by utterly incompetent and ...

    • 5 Answers
  • Editorial Team

    What is a programmer’s life like?

    • 5 Answers
  • Editorial Team
    Editorial Team added an answer They both accomplish the same end goal, but they work… May 15, 2026 at 5:11 pm
  • Editorial Team
    Editorial Team added an answer Well, there is append! as a primitive, which solves most… May 15, 2026 at 5:11 pm
  • Editorial Team
    Editorial Team added an answer It's true you can't make an iPhone app directly from… May 15, 2026 at 5:11 pm

Trending Tags

analytics british company computer developers django employee employer english facebook french google interview javascript language life php programmer programs salary

Top Members

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.