Tôi đang cố gắng hiểu phần tử Forward()
từ pyparsing. Giả sử tôi có BNF đơn giản này:Viết phân tích cú pháp đệ quy với pyparsing
identifier =
"a..z,$,_" < "a..z,$,_,0..9" >
package_name =
identifier
/(package_name "." identifier)
và tôi cố gắng phân tích một gói đơn giản như java.lang.String
tôi nhận được một trong hai chỉ java
như kết quả hoặc không bao giờ trở về từ đệ quy. Tôi đã thử nó như thế này:
from pyparsing import alphas,alphanums, Word, Forward, ZeroOrMore, Group, Literal
identifier=Word(alphas+"$_",alphanums+"$_")
dot=Literal(".")
package_name = Forward()
definition = package_name+dot+identifier
package_name << Group(identifier+ZeroOrMore(definition))
package_name.parseString("java.lang.String")
sẽ in [[ 'java']]
from pyparsing import alphas,alphanums, Word, Forward, ZeroOrMore, Group, Literal
identifier=Word(alphas+"$_",alphanums+"$_")
dot=Literal(".")
package_name = Forward()
definition = identifier^package_name+dot+identifier
package_name << definition
package_name.parseString("java.lang.String")
sẽ đạt đệ quy giới hạn
cách làm việc Forward
giữ chỗ này?
Tại sao bạn không làm 'package_name = ZeroOrMore (định danh + dấu chấm) + số nhận dạng'? Tôi nghĩ rằng vấn đề với những gì bạn đang làm là nó recurise * và * liên quan đến ZeroOrMore, cho phép nó tiếp tục phù hợp với số không. BNF ban đầu của bạn không tương đương với ZeroOrMore. Nhưng nó đơn giản hơn để tránh đệ quy hoàn toàn. – BrenBarn
tôi biết tôi có thể làm theo cách khác. giống như 'delimitedList (identifier, delim =". ")' nhưng tôi muốn hiểu được 'Forward' đệ quy ParserElement. Thậm chí 'package_name << definition' sẽ không hoạt động –